[1] 本章内容在 [Stroustrup,2013]的第13~15章有更加详细的描述。
[2] 注意把声明(用作接口)和定义(用作实现)区别开来;参见3.1节。
[3] 头文件的作用是描述接口和强调逻辑结构;参见3.2节。
[4] 如果源文件实现了头文件当中的函数,则应该把头文件#include到源文件中;参 见3.2节。
[5] 不要在头文件中定义非内联函数;参见3.2节。
[6] 用命名空间来表达逻辑结构;参见3.3节。
[7] 用using指令来为基础库(如std)或某个局部作用域进行(命名空间)转换;参 见3.3节。
[8] 不要在头文件中使用using指令;参见3.3节。
[9] 当无法完成既定的任务时,记得抛出一个异常;参见3.4节。
[10] 使用异常进行错误处理;参见3.4节。
[11] 在设计阶段就想好错误处理的策略;参见3.4节。
[12] 用专门设计的用户自定义类型作为异常类型(而非内置类型);参见3.4.1节。
[13] 别试图捕获每个函数中的每个错误;参见3.4节。
[14] 如果你的函数不抛出异常,那么把它声明成noexcept;参见3.4节。
[15] 让构造函数建立不变式,不满足就抛出异常;参见3.4.2节。
[16] 围绕不变式设计你的错误处理策略;参见3.4.2节。
[17] 能在编译时检查的问题尽量在编译时检查(使用static_assert);参见3.4.3节。