effective c++ (一)

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

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

一、c part of  C++,c++时以c为基础发展起来的,彻底兼容于c语言编程

二、object-oriented C++,面向对象的封装、继承、多态等三大特性,C++都可以很好支持数组

三、template C++,使得C++支持泛型编程编程语言

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

 

注意:函数

因为C++存在以上四种多重范型编程,故使用时注意不一样语言层次,进行高效编程的原则也会存在差别工具

 

条款02:尽可能以const、enum、inline替换#definethis

该条款从宏观工具来讲也能够为:尽可能用编译器代替预处理器spa

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

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

三、const支持变量限定做用域,而#define则老是全局有效

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

class GamePlayer

{

private:

  static const int NumTurns = 5;

  int Scores[NumTurns];

}

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

class GamePlayer

{

private:

  enum { NumTurns = 5 };

  int Scores[NumTurns];

};

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

总结:

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

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

 

条款03:尽量使用const

一、若是const出如今*左侧,则表示指针所指物为常量,若const出如今*右侧,则表示指针本省为常量

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

若将返回值申明为const则能够避免a*b = c 相似的错误

若将不改变的变量声明为const 能够避免if(a = 0)相似的错误

三、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];
} 

四、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

 

注意:

一、若是函数得返回类型是个内置类型,那么改动函数得返回值历来就是不合法得

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

三、编译器强制实施bitwise constness

相关文章
相关标签/搜索