- 条款1:视C++为一个语言联邦:C、Object-Oriented C++、Template C++、STL
对于内置类型pass-by-value 比pass-by-reference高效,用户自定义类型pass-by-reference-to-const更好
STL中迭代器和函数对象都是在C指针的基础上塑造出来的,所以旧式的C pass-by-value再次试用
- 条款2:尽量以const,enum,inline替换#define
1、对于单纯的常量,最好以const对象或enums替代#define
2、对于形似函数的宏,最好用inline函数替代#define
因为使用的#define 的变量未进入编译器的记号表(symbol table)
#define ASPECT_RATIO 1.63 ==>const double AspectRatio = 1.63
- 条款3:尽可能使用const
void f1(const Widget* pw) <=> void f2(Widget const *pw) //等价,f1/f2获得一个指针,指向一个常量的(不变的)Widget对象
- 条款4:确定对象使用前已被初始化。
对内置类的对象进行手工初始化,因为C++不保证初始化它们。
构造函数最好使用成员初值列,而不要在构造函数内使用赋值操作。前者效率更高,后者要先调用 default构造再赋值
为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。????
- 条款5:了解C++默默编写并调用哪些函数。
9、编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。是 public且 inline 的
10、当手工创建一个构造函数后,编译不会再创建default构造函数。
11、内含引用或const成员,编译器不会创建copy assignment操作符。
class Empty{}
==》
class Empty{
public:
Empty(){}
Empty(const Empty& rhs){}
~Empty(){}
Empty& operator=(const Empty& rhs){} //拷贝复制函数
}
- 条款6:若不想使用编译器自动生成的函数,应该明确拒绝。
12、为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。
- 条款7:为多态基类声明virtual析构函数。
13、polymorphic带有多态性质的base classes 应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。当子类以父类指针的形式被析构时,子类对象的成分没有被销毁,故需要将父类的析构函数需要为virtual
14、Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不应该声明virtual析构函数。
15、若父类带有pure virtual(纯虚函数)时,子类的析构函数中会有对父类析构函数的调用,因此必须为父类的纯虚函数提供一份定义。