static
- 声明在堆上申请静态存储
- 对于局部变量,将存储方式改为静态存储
- 对于全局变量,将连接方式局限在文件内
-
类中static变量:属于整个类,独立存储,没有this指针
inline
- inline 放在函数定义前,定义为内联函数
- 成员函数在类内定义默认为内联函数
- inline 编译器做类型检查
- 避免函数调用开销
-
内联函数的每次调用都将复制代码,使得代码膨胀
explicit
- 强制显示构造,只能用于类内构造函数前,抑制隐式转换构造
内置类型手工初始化,c++不保证内置类型初始化
构造函数最好使用member initialnal list 初始化,尽量不使用赋值
具有多态性质的基类应该声明一个虚析构函数,带有虚函数时,也应该设计一个虚析构函数
在构造和析构函数中不要调用virtual函数,这类调用无法实现下降至derived class
operator= 返回一个reference to *this 以实现连续赋值
保证operator = 自我赋值或者交换时的正确性
copy 函数确保全部元素复制,不仅是对象内部成员变量,也包括其base class 成员
不要尝试用某个copy实现另一个copy函数,将共同即能放入第三个函数中,供copy函数调用即可
将 资源封装成类对象,不使用时自动调用析构函数,释放资源。RAII(获得即初始化)
- 对RAII对象执行复制操作的处理
- 禁止复制:复制操作private
- 底层资源引用计数:tr1::shared_ptr
- 复制底层资源:深拷贝
- 转移底层资源控制权:pointer 和tr1::auto_pointer
以独立语句将new返回的指针置入智能指针中,避免在复合语句中执行置入
-
接口设计应该与内置类型保持一致
- 阻止误用:建立新类型,限制类型操作,束缚对象值,消除客户资源管理责任
不要返回local stack 对象,或者refrence of heap 对象
用non-menber non-firend 函数替换member函数,即通过外函数调用member 函数实现,保证类对象的封装性
重载操作符可以在类内部,也可以在类外部,外部定义重载操作符可以对全部参数隐式转型
-
降低文件之间的依赖关系
- 在定义文件中,用到的类只做前置声明而不引入头文件定义
- 在实现文件中,include用到的类的头文件
- 引用和指针不需要定义式,声明对象时需要定义式
derived class 将会掩盖同名的base class 函数,使用 using声明或者转交函数(函数内部调用base class 被覆盖的函数)使用base class 被覆盖的函数
-
接口继承与实现继承
- 声明一个pure virtual函数是为了让derived class 只继承函数接口
- 声明一个impure virtual 函数是为了让derived class 继承函数接口和缺省实现
- 声明一个non-virtual 函数是为了让derived class 继承函数接口和一份强制实现
绝对不重新定义继承来的non-virtual函数
-
绝对不重新定义继承来的缺省参考值
: 缺省值是静态绑定的 应用域复合表示has a, 实现域复合表示is implemented in terms of
- private 继承意味着只有实现部分被继承,接口部分被忽略
- private继承意味着参考实现,当derived class 需要访问基类成员或者重定义继承而来的virtual 函数时,使用private继承
- private 继承可以实现empty class 最小化
derived class templates 内部通过 “this->”使用base class templates 内成员,或者使用using 子句表明成员来源