转型动作会产生副本。2)真正调用了A类的fun函数,而1)却调用了转型产生的临时对象的函数,如果涉及到修改对象的数据,真正被修改数据的是临时对象,而不是this。
1) static_cast<A>(*this).fun();
2) A::fun();
尽量避免dynamic_cast操作,尝试寻找其他替代方案。
如果转型是必要的,那就将其封装在一个函数当中,客户不需要负责转型,只需要调用该函数。
E28 避免返回handles指向对象内部成分
增强封装性,帮助const成员函数行为像个const,降低“虚吊号码”的可能性。
E29 为“异常安全”而努力是值得的
使用智能指针维护资源,使用copy and swap实现“强烈保证”
E30 透彻了解inlining函数的里里外外
将inline用于模板函数要格外小心,需要模板的所有具现化都能够inline。
virtual函数不能够被inline,在vs中,编译器将会忽略inline的申请。
如果以指针等方式来调用inline函数,编译器将不会用函数本体来替换语句。
对构造函数和析构函数进行inline必须考虑清楚,因为编译器还会做很多别的事情使他们变得巨大,例如构造函数内部调用基类的构造函数等等。
由于模块调用inline函数时,编译进去的可能是函数的本体,所以一旦inline函数被改动过,调用方也要重新编译。如果不是inline函数,只要重新链接就行了,如果inline函数是被动态加载的,根本就不用链接。
许多编译器选择在调试版本中拒绝inline,以便设置断点进行调试。