EFFECT C++总结
条款01 视c++为一个语言联邦
….好吧
条款02 尽量以const,enum,inline代替#define
1、用const常量代替define,方便调试,所使用的名字会进入符号表
2、常量指针 和class专属常量(static const int a = 5)
在class中:属于声明,不是定义式(如果不用取得常量的地址,就不用定义,定义的时候也不用赋初值了,声明已经赋了)
3、enum hack(有些编译器不支持在class内赋初值)
不可以取得enum的地址,跟define很像
4、对于define的函数..额…所有参数用个小括号括住…当然,inline template代替会更好~
条款03 尽可能使用Const
指针中,const处于不同位置:星号前面:被指物为常量,星号后面:指针为常量
const成员函数,两个函数的常量性不同,是可以重载的~(常量函数(不更改任何成员变量)和非常量函数)
【如果函数返回的是一个内置类型的返回值,修改这个返回值是不合法的】
mutable:成员变量将允许在常量函数被修改
非const函数可以调用const函数
不要让const函数调用非const函数
条款04 确定对象被使用前已先被初始化
内置型对象要手工初始化,C++不保证会初始化
确保每一个构造函数对每一个对象进行初始化
赋值 与 初始化的区别:
成员初值列属于初始化,在构造函数内执行的…是赋值~
成员初值列要列出所有成员
对static对象,确定哪个先初始化是很困难的,有必要的话用单例(local static)代替 0n
条款05 了解C++默默编写并调用那些函数
1、default构造函数:
2、析构函数:不是virtual,除非父类的析构函数是virtual)
3、复制构造函数:按成员类型:
类类型(string):直接调用类(string)的构造函数
内置类型:直接copy bits
4、赋值运算符重载:成员带引用的或者常量的,都拒绝生成,此时,没有重载运算符而且进行实例之间赋值操作的话,将会出现编译错误
条款06 若不想使用编译器自动生成的函数,就该明确拒绝
1、将想要禁止的函数声明为private(成员方法还是能够使用)
2、将想要禁止的函数声明为private,不实现(连接时错误)
3、将该类继承一个UnCopyable的类(该类的方法同样声明为private,不实现)【编译时错误,但是会导致多重继承】
条款07 为多态基类声明virtual析构函数
1、一个要用作基类的class(尤其带virtual成员),其析构函数也要是virtual
2、不能所有类的析构函数都是virtual,你要弄个vtbr,占空间
3、不要继承不是设计为基类的构造函数(如STL(string,vector))他们的析构函数可没有virtual
条款08 别让异常逃离析构函数
1、析构函数跑出异常可能会导致程序过早结束,或者其他不确定行为
2、跑出异常后有两种处理办法:记录异常并且结束程序,吞下异常
3、比较好的解决方案,弄一个函数,让用户自己选择:
void Close()
{
db.close();
closed = true;
}
~DBConn()
{
if(!closed)
{
try{
db.close();
}
catch{
…..
}
|
}
}
条款09 绝不让构造和析构过程中调用virtual函数
1、在继承体系中,构造函数的执行顺序:父类 ->子类。在父类的构造函数,或者其调用的函数中调用virtual函数,此时,子类还没创建ÿ