基础:
1.区别指针和引用
经验:1.如果指向可以改变,则用指针,否则引用。2.引用必须有初值。3.在引用和指针作为返回值的选择时,一般选择引用。
2.显式使用c++转型操作符(static_cast,dynamic_cast,const_cast,reinterpret_cast)
经验:增加了可阅读性。
static:与旧式转型类似
dynamic:使用在继承条件下的父类指针向子类对象的转型。
const:将对象的常量属性去掉。
reinterpret:转换函数指针(返回值)类型。
3.不能用数组的方式来使用多态
理由:1.当以父类数组指针来实现多态时,父类对象与子类对象大小不同,所以用父类指针多态调用子类数组时,肯定会造成访问子类对象指针不正确。2.用父类数组多态删除也会造成结果未定义。
4.
异常:
9.根据异常的栈展开原理,防止在调用destructors资源泄露
理由:一旦抛出异常,就会调用局部变量的析构函数,而当局部变量是指针类型时,就要用资源管理类(或者类类型)来防止指针锁指向的目标资源泄露。
经验:把资源封锁在对象内,就能防止资源泄露。
10.怎么处理构造函数内的new操作符可能导致的异常
理由:构造函数中的new发生的异常并不会调用该类型的析构函数,因为该类型还未成为对象,所以该类型中的在抛出异常之前建立的指针类型就会导致资源泄露。
经验:用资源管理类来防止资源泄露。
11.不让异常流出destructor
理由:异常抛出会调用析构函数,如果析构函数可能抛出异常,则出现连续两个异常的可能,如果连续两个异常,程序直接出发terminate。
经验:在构造函数以内,捕捉并处理所有可能产生的异常。
19.避免产生临时对象
什么是临时对象:不可见的,不会再源代码中出现,但是会产生的对象。
临时对象产生条件:1.隐式类型转换和reference to const 2.函数返回对象
经验:根据临时对象产生的条件,尽量避免临时对象的产生,以提高程序的执行效率。
20.返回值优化(return value optimization)来降低临时对象产生的成本
经验:用构造函数的形式来取代返回对象。这样可以消除放回临时对象的成本。
21.利用重载消除临时对象产生的成本
经验:利用参数类型重载,来防止传递引用参数时,不同类型产生的临时对象。
22.复合形式操作符(+=)取代独身形式操作符(+)爱消除临时对象的成本
经验:复合操作符(+=)不产生临时对象,独身操作符(=)容易产生临时对象。
23.针对不同需求使用不同程序库
24.虚函数、多继承、RTTI的代价
虚函数:多出空间用来存放虚表和虚指针
多继承:多空间来存放指针
RTTI:多空间来存放类型信息
技巧篇
25.虚拟构造函数、虚拟拷贝构造函数、虚拟非成员函数的实现技巧
虚拟拷贝构造函数技巧:利用较为宽松的虚函数返回值规则,派生类重写基类虚函数的返回值不必与基类的虚函数返回值一致。所以声明一个函数,内部调用拷贝构造函数同时重写返回值类型,就达到了虚拟构造函数的目的。
虚拟非成员函数技巧:将实现虚函数的对象作为参数传入非成员函数中,就实现了非成员函数虚拟化。
浙公网安备 33010602011771号