一、让自己习惯C++
Accustoming Yourself to C++
01:视C++为一个语言联邦
View C++ as a federation of languages
简单总结可理解为C++包括以下内容:
①C语言部分
②Object-Oriented C++ 包括封装多态继承等机制
③Template C++ 泛型编程部分
④STL 即标准模板库,包含容器、算法、迭代器。
02:尽量以const,enum,inline替换#define
Prefer consts,enums,and inlines to #defines.
这是因为#define不被视为语言的一部分,不进入编译器,不进入记号表
对于单纯常量,最好用const对象或enums替换#define
对于形似函数的宏(macro),最好用inline函数替换
03:尽可能使用const
Use const whenever possible.
1、如果const出现在星号左边,表示被指物是常量,如果const出现在星号右边,表示指针自身是常量。如果出现在星号两边,表示指针和被指物都是常量。
2、在某些情况下,函数返回值也需要被定义为const,比如书中所说的有理数相乘。
3、及时调用了const修饰的成员函数,也可能改变对象的内容,比如修改了指针指向的内容。
04: 确定对象被使用前已被初始化
Make sure that objects are initialized before they’re used.
1、如果const出现在星号左边,表示被指物是常量,如果const出现在星号右边,表示指针自身是常量。如果出现在星号两边,表示指针和被指物都是常量。
2、在某些情况下,函数返回值也需要被定义为const,比如书中所说的有理数相乘。
3、及时调用了const修饰的成员函数,也可能改变对象的内容,比如修改了指针指向的内容。
构造/析构/赋值运算
Consructors,Destructors,and Assignment Opeartions
05: 了解C++默默编写并调用哪些函数
Know what functions C++ silently writes and calls.
编译器暗自为class创建了Default构造函数,copy构造函数,copy assigment操作符以及析构函数。唯有当这些函数被需要(被调用),它们才会被编译器创建出来。
06: 若不想使用编译器自动生成的函数,就应该明确拒绝
Explictly disallow the use of compiler-generated functions you do not want.
07: 为多态基类声明Virtual析构函数
Declare destructors virt in polymorphic base classes.
任何class只要带有virtual函数都几乎确定应该有一个virtual析构函数。
注意:STL容器都没有virtual析构函数,所以最好不要继承他们,否则可能会造成内存泄漏。
8、别让异常逃离析构函数
1、析构函数不要吐出异常,如果一个被析构函数调用的函数可能会抛出异常,析构函数应该捕捉任何异常,然后吞掉它们或结束程序。
2、如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非析构函数)执行该操作。
9、绝不在构造和析构过程中调用virtual函数
Never call virtual functions during construction or desruction
1、在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。
10、令赋值操作符返回一个reference to * this
*Have assignment operators return a reference to this
11、在operator =中处理“自我赋值”
Handle assignment to self in operator=
1、operator =要考虑“自我赋值”和“异常安全性”
2、确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
12、复制对象时勿忘记其每一个成分
Copy all parts of an object.
1、Copying函数应该确保复制“对象内的所有成员变量”及“所有Base class成分”。
2、不要尝试以某个copying函数实现另一个copying函数。应该将共同机能放进第三个函数中,并由两个coping函数共同调用。