对于内置类型pass-by-value 比pass-by-reference高效,用户自定义类型pass-by-reference-to-const更好函数
STL中迭代器和函数对象都是在C指针的基础上塑造出来的,因此旧式的C pass-by-value再次试用this
一、对于单纯的常量,最好以const对象或enums替代#define设计
二、对于形似函数的宏,最好用inline函数替代#define指针
由于使用的#define 的变量未进入编译器的记号表(symbol table)code
#define ASPECT_RATIO 1.63 ==>const double AspectRatio = 1.63对象
void f1(const Widget* pw) <=> void f2(Widget const *pw) //等价,f1/f2得到一个指针,指向一个常量的(不变的)Widget对象资源
对内置类的对象进行手工初始化,由于C++不保证初始化它们。get
构造函数最好使用成员初值列,而不要在构造函数内使用赋值操做。前者效率更高,后者要先调用 default构造再赋值编译器
为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。????io
九、编译器能够暗自为class建立default构造函数、copy构造函数、copy assignment操做符,以及析构函数。是 public且 inline 的
十、当手工建立一个构造函数后,编译不会再建立default构造函数。
十一、内含引用或const成员,编译器不会建立copy assignment操做符。
class Empty{} ==》 class Empty{ public: Empty(){} Empty(const Empty& rhs){} ~Empty(){} Empty& operator=(const Empty& rhs){} //拷贝复制函数 }
十二、为驳回编译器自动提供的技能,可将相应的成员函数声明为private而且不予实现。
1三、polymorphic带有多态性质的base classes 应该声明一个virtual析构函数。若是class带有任何virtual函数,它就应该拥有一个virtual析构函数。当子类以父类指针的形式被析构时,子类对象的成分没有被销毁,故须要将父类的析构函数须要为virtual
1四、Classes的设计目的若是不是做为base classes使用,或不是为了具有多态性,就不该该声明virtual析构函数。
1五、若父类带有pure virtual(纯虚函数)时,子类的析构函数中会有对父类析构函数的调用,所以必须为父类的纯虚函数提供一份定义。
1六、析构函数绝对不要吐出异常,若是一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,而后吞下它们(再也不传播)或结束程序。
1七、若是客户须要对某些操做函数运行期间抛出的异常作出反应,那么class应该提供一个普通函数(而非析构函数)执行该操做。
1八、子类构造时,先调用base class,此时子类被认为是一个base class。析构时先调用自身的析构函数,再调用base class的析构函数。
Widget& operator=( constWidget& rhs){... return* this;}
20、确保当对象自我赋值时operator=有良好的行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。
2一、肯定任何函数若是操做一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。
条款12:复制对象时勿忘其每一成分。
资源管理:
2五、以对象管理资源的两个关键想法:
(1)、得到资源后马上放进管理对象。资源获取时机即是初始化时机。
(2)、管理对象运用析构函数确保资源被释放。
2六、使用shared_ptr智能指针。
条款14:在资源管理类中当心copying行为。