zoukankan      html  css  js  c++  java
  • effective c++ (一)

    条款01:把C++看作一个语言联邦

    C++是一种多重范型编程语言,一个同时支持过程(procedural),面向对象(object-oriented),函数形式(functional),泛型形式(generic),元编程(metaprogramming)的语言

    1、c part of  C++,c++时以c为基础发展起来的,完全兼容于c语言

    2、object-oriented C++,面向对象的封装、继承、多态等三大特性,C++都能够很好支持

    3、template C++,使得C++支持泛型编程

    4、STL,STL是个标准模板库,它对容器,迭代器,算法,函数对象等进行了封装,使得使用者能够直接调用

    注意:

    由于C++存在以上四种多重范型编程,故使用时注意不同语言层次,进行高效编程的原则也会存在差异

    条款02:尽量以const、enum、inline替换#define

    该条款从宏观工具来说也可以为:尽量用编译器代替预处理器

    1、对于引用接口头文件中的宏,在编译时若是异常,使用者很难追踪到问题源头;因宏直接被替换,到编译时候,其名称只存在于预编译阶段,而不会进入编译阶段的的符号表中;

    2、const常量能够比#define产生更轻量的代码,因#define定义的变量在替换时候会产生多个副本,而const则不会

    3、const支持变量限定作用域,而#define则总是全局有效

    4、对于class专属常量,对于有的编译器,其定义域声明同普通成员变量的声明一致,且可以同事给予赋值;对于有的编译器则不行,必须按照函数定义的形式给以赋值;如果变量的值必须在声明时要求给定(如该变量将作为类成员变量数组成员的大小)

    class GamePlayer

    {

    private:

      static const int NumTurns = 5;

      int Scores[NumTurns];

    }

    若编译器不允许声明时给NumTurns赋值,则可借助枚举进行规避,

    class GamePlayer

    {

    private:

      enum { NumTurns = 5 };

      int Scores[NumTurns];

    };

    此处的枚举变量与常量的区别在于:常量可以取地址,而枚举变量不能够取地址

    总结:

    1、对于单纯变量,最好以const对象或enums替换#defines

    2、对于形似函数的宏(宏函数),最好改用inline函数替换#defines

    条款03:尽可能使用const

    1、如果const出现在*左侧,则表示指针所指物为常量,若const出现在*右侧,则表示指针本省为常量

    2、在一个函数声明式中,const可以和函数返回值、个个参数、函数自身(若为成员函数)产生关联,

    若将返回值申明为const则可以避免a*b = c 类似的错误

    若将不改变的变量声明为const 可以避免if(a = 0)类似的错误

    3、const成员函数的优点:

      a、它使得成员函数更容易被理解,很容易得知哪个函数可以改动对象内容而哪个函数不可以

      b、它们是操作“const 对象”成为可能,是pass by reference to const方式传递对象得技术前提

      c、两个成员函数如果只是常量性不同,可以被重载

    class TextBlock
    {
    public:
         const char&  operator[](std::size_t position) const
        { return text[position];}
        char& operator[](std::size_t position)
        { return text[position]; }
    private:
        std::string text;  
    }
    
    TextBlock tb("Hello");
    std::cout << tb[0];  //调用非const operator[]
    
    const TextBlock ctb("Hello")
    std::cout << ctb[0]   //调用const operator[]
    
    void print(const TextBlock& ctb)
    {
        std::cout << ctb[0];
    } 

    4、bitwise constness 和 logical constness

      a、bitwise通过检查函数内有无赋值操作来判定;为了保证bitwise的常量性,不允许在const函数中存在为non-static成员变量赋值得操作,为了破除这种限制,需要在non-static变量申请时,添加mutable关键字 mutable std::size_t textLength;

      b、在const与非const函数的声明中造成了代码的高度重复

      c、const_cast<type>(xxx)能够去除xxx变量的const属性;static_cast<const type>(xxx)能够为xxx变量加上const属性

      d、必须使用非const函数中调用const函数的方式,因使用const中调用非const将破坏const函数的 bitwise constness

    class TextBlock
    {
    public:
         const char&  operator[](std::size_t position) const
        {
             ...
             ...
             ...     
             return text[position];
        }
        char& operator[](std::size_t position)
        {        
            return const_cast<char&>(      //将op[]返回值的const去除
                        static_cast<const TextBlock&>(*this)  //为*this加上const
                       [position]   //调用op[]
                       ); 
        }
    private:
        std::string text;  
    }    
    View Code

    注意:

    1、如果函数得返回类型是个内置类型,那么改动函数得返回值从来就是不合法得

    2、将某些东西声明为const,有利于编译器侦测出错误

    3、编译器强制实施bitwise constness

  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/penghuster/p/6082849.html
Copyright © 2011-2022 走看看