2.尽可能使用const、enum、inline替换#define ===>编译器替换预处理器 (条款02)
记住:
2.1.对于单纯常量,最好以const对象或者enum替换#defines.
2.2.对于形似的函数的宏,最好改用inline函数替换#defines.
3.尽可能使用const,如果关键字const出现在星号左边(const T*),表示被指物是常量;如果出现星号右边(T* const),表示指针自身是常量。如果出现在两边(const T* const )表示被指物和指针都是常量。
3.1 const 加在函数后边(const int foo()),返回一个常量值,如果返回变量可被赋值(int foo() = 11),预防没有意思的赋值行为。
3.2将某些东西声明为const可以帮助编译器侦测出错误用法。const可被施加于任何作用域内对象、函数参数、函数返回类型、成员函数本体
3.3编译器强制实施bitwise constness 但你编写程序时应该是有概念的常量性
3.3当const 和non-const 成员函数有着实质等价实现时,令non-const版本调用const版本可避免代码重复。(条款03)
4.确定对象被使用前已经初始化,永远在使用对象前之前先将他初始化。
4.1如果是类,则在构造函数之前将所有值初始化,初始值和赋值不同,初始化是值初始化动作发生在构造函数之前,在构造函数上的叫赋值。
Test::Test(A a,B b):a(a) //初始化
{
this.b=b; //赋值
}(原因系统会为b先初始化初值,再给b赋值性能浪费).
4.2如果遇到出现static,一定要确保staic对象被初始化过,static 对象其寿命从被构造出来直到程序结束为止。注意编译顺序!!!!!
4.3总结
4.3.1为内置对象进行手工初始化,因为C++不保证初始化他们
4.3.2为构造函数最好使用成员初始值,而不要在构造函数本体内使用赋值操作。初始列列出的成员变量,其排列次序应该和他们在class中申明次序相同
4.3.3为避免除"跨编译单元之初始化次序"问题,请以localstatic对象替换non-local static 对象。(条款04)
5.了解C++默默编写并调用哪些函数
5.1编译器会为类声明一个析构函数,拷贝函数和构造函数和opertor=(默认都是内联函数)。(条款05)
6.若不想使用编辑器自动生成的函数,就该明确拒绝。
6.1可以将编译器生成的函数加上private 阻止函数调用。
6.2class A
{
protected:
A();
~A();
private: // 构造函数
A(comst A&);
A& opertor=(const A&);
}
class B:private A
{
}成功阻止友元函数调用拷贝函数,这行的同,原因是这些函数”编译器生成的版本“会尝试调用base class 的对应兄弟,那些调用会被编译器拒绝,因而失败。
6.3总结
6.3.1为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。
7.为多态基类声明vritual析构函数
7.1任何class带有virtual函数几乎都有一个virtual析构函数
7.2virtual本身带有一个指针占用字节
7.3拒绝继承不带有virtual的class
7.4析构函数的派生方式是最深层的那个class其析构函数最先被调用,然后是其每个bass class的析构函数被调用。
7.5总结:
7.5.1带多态性质的baseclass(基类)应该声明一个vritual析构函数。如果class带有任何virtual函数,他就拥有一个vritual析构函数
7.5.2 Class的设计目的如果不是作为base class使用,或者不是为了具备多态行政,就不该声明为vritual析构函数。(条款07)
8.别让一场逃离析构函数
8.1C++不禁止析构函数吐出异常,但是不鼓励你这么做
8.2总结
8.2.1析构函数绝对不要突出一场。如果一个被析构的函数调用函数可能抛出异常,析构函数应该无法捕捉异常,然后吞下他们不结束程序
8.2.2如果一个客户需要对某个操作函数运行期间抛出异常的反应,那么class应该提供(条款08)
9.绝对不在构造函数和析构函数过程中调用vritual函数
9.1基类先于派生类被构造 ,由于base class析构函数的执行更早于derived class构造函数,当base class构造函数执行时derived class的成员变量未初始化
9.2在派生类对象的基类对象构造期间,对象的类型是基类而不是派生类
9.3确定你的构造函数和析构函数都没有调用virtual函数。而他们调用的所有函数都是服从同一约束。
9.4总结
9.4.1在构造和析构函数期间不要调用virtual函数,因为这类调用从不下降到派生类(条款09)