1.尽量以const,enum,inline替换#define
用const替换#define原因之一:调试代码的时候,宏替换是直接把一个变量名替换为一个数字,在调试器里直接出现一个数字你可能会摸不着头脑,把这个变量定义为const就会出现变量名,不至于忘记它是干什么的。
总结:对于单纯的常量,最好以const或者enum替换#define,对于形似函数的宏,最好用inline函数替换#define
2.尽可能的使用const
想要pass by reference来提高效率又不想改变原对象,别忘了定义为const
在重载符号,比如重载*时,返回对象最好定义为const,以防有人if(a * b = c),因为少打一个=而把c赋值给a*b的结果了。但是在重载[ ]时,不能返回不可修改的const对象,因为很多时候都会进行 a[0] = 'x'这种修改变量的操作,而且别忘了要返回引用形的变量,否则修改的只是一个副本。
注:关键字mutable可以释放掉non-static成员变量的bitwise constness约束,使成员可被修改。
3.确定对象使用前已经被初始化。
4.在C++的类中为了杜绝编译器自己提供的机能(比如拷贝构造,赋值运算符),可以将其声明在private中且不予实现,并且继承此类的子类也将杜绝此机能(因为子类拷贝构造也需要调用父类)。
5.为多态基类声明virtual析构函数。(防止父类型的指针开辟的子类型的对象,在析构时只调用父类型的析构函数,没有析构开辟的子类而导致内存泄漏,比如:工厂模式)
注:如果不需要用到多态,且这个类根本不会被当做base class,那就没必要声明成virtual,只会浪费空间而已。
同样的,不要去继承用到多态,析构函数却不是虚函数的父类!(比如去继承non-virtual的STL容器)
6.别把异常放在析构函数(如果要把任何一个可能抛出异常的函数放在析构函数中,析构函数应该吞下他们不传播,或者结束程序)。
7.绝不在析构或者构造函数中调用virtual函数。
8.令operator=返回一个reference to *this(支持连等),并处理自己给自己赋值的情况(直接return *this)。
可以以by value的方式传参然后swap~
9.复制对象时勿忘其每一个成分。
10.RAII资源管理
读到p63,待续。
阅读(1540) | 评论(0) | 转发(0) |