Effective C++(五)实现

来源:互联网 发布:将照片从mac导入iphone 编辑:程序博客网 时间:2024/03/29 17:36

一 尽可能延后变量定义式的出现时间:

(1)改善效率:避免构造和析构非必要对象。

(2)增加程序的清晰度。


二 尽量少做转型动作:

(1)C++提供的新式转型:

*const_cast<T>(expression):将对象的const属性移除。

*static_cast<T>(expression):基本上拥有与C旧式类型转换相同的威力和限制。

*reinterpret_cast<T>(expression):执行低级转换,不可移植。

*dynamic_cast<T>(expression):主要用来执行“安全向下转型”。

*补充c的旧式转型:(T)expression或T(expression)。

(2)C++类型转换的优点:

*容易在代码中被识别出来。

*各转型动作的目标越窄化,编译器越可能诊断出错误的应用。

(3)如果可以,尽量避免转型,如果有个设计需要转型动作,试着发展无需转型的替代设计。


三 避免返回handles指向对象内部成分:

(1)handles:指针、迭代器和reference。

(2)避免成员函数返回handles指向对象内部。遵守这个条款可增加封装性、帮助const成员的行为更像个const和降低悬挂handles的发生。


四 为“异常安全”而努力是值得的:

(1)异常安全函数特点:不泄露任何资源和不允许数据破坏。

(2)异常安全函数提供以下三个保证之一:

*基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下。没有任何对象或数据会因此而败坏。

*强烈保证:如果异常被抛出,程序状态不改变。如果函数成功,则是完全成功;如果函数失败,程序会恢复到调用函数之前的状态。

*不抛掷(nothrow)保证:承诺绝不抛出异常,因为它们总是完成承诺的功能。

*注意:可能的话请提供nothrow保证,但对大部分函数而言,抉择往往落在基本保证和强烈保证之间。

(3)函数提供的异常安全保证通常最高只等于其所调用的各个函数的异常安全保证中的最弱者。


五 透彻了解inlining的里里外外:

(1)inline只是对编译器的一个申请,不是强制命令。申请方式:隐式申请(将函数定义于class定义式内);显式申请(将inline函数定义前加上关键字inline)。

(2)inline函数的优点:

*免除函数调用成本;

*方便编译器的优化机制进行优化;

(3)inline函数的缺点:

*过度热衷inline会造出代码膨胀;

*inline函数无法随程序库的升级而升级,一旦决定改变inline函数的,所有使用到inline函数的客户程序都必须重新编译;

*大部分调试器对inline函数束手无策。

(4)将大多数inline限制在小型、被频繁调用的函数上。


六 将文件间的编译依存关系降至最低:

待续...