1.视C++为一个语言联邦
可以将C++视为四个次语言的联邦:
(1)C语言
(2)Object-Oriented C++
(3)Template C++
(4)STL
例如对内置类型,pass-by-value比pass-by-reference有效,然而对于自定义类型,pass-by-reference-to-const往往更好。
2.尽量以const,enum,inline替换#define
原因是:#define的记号名称可能没进入记号表,当你运用此常量获得一个编译错误信息时,难以查找到原因所在。
enum不可以取地址,const可以取,#define地址也不合法。
3.尽可能使用const
除非你有改动参数或者对象的行为,否则最好把他们声明为const,因为这样可以避免很多不必要的烦恼。
编译器强制实施的是按位的常量性。
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
4.确定对象在使用前已先被初始化
(1)对于非内置成员,我们要手工对他们进行初始化。
(2)对于内置类型以外的其他任何东西,我们应该用构造函数对他们进行初始化。
注意构造函数初始化和赋值的区别:
在函数内用等于号给成员变量赋值这就叫做赋值。
在函数的参数列表内进行赋值也就是成员初值列进行赋值(也就是对象的成员变量的初始化动作发生在进入构造函数本体之前)
使用后一种初始化的方式它的效率更高,区别是赋值先调用一次default构造函数在调用一次copy assignment操作符,而初始化只调用了一次copy构造函数。(对内置类型其实是一样的但是为了一致性最好统一用初始化)
C++有着十分固定的"成员初始化次序"。次序如下:base classes更早于derived classes被初始化,而class的成员变量总是以其声明顺序被初始化。
为免除”跨编译单元之初始化次序“问题,请以local static对象替换non-local static对象(因为跨编译单元你不知道他的初始化顺序很容易就会导致错误的情况发生。)