-
视C++为一个语言联邦
C、面向对象、泛型和模板、STL -
尽量以const, enum, inline替换 #define
宏定义不够安全 -
尽可能使用 const
const * int p; // 被指向物是常量
- const int p; // 指针本身是常量
-
确定对象被使用前已先被初始化
初始化列表,初始化次序 -
了解C++默默编写并调用哪些函数
默认构造函数、拷贝构造函数、赋值运算符、析构函数 -
若不想使用编译器自动生成的函数,就应该明确拒绝
使用private封装不想被调用的函数 -
为多态基类声明virtual析构函数
析构时,先调用最底层派生类的析构函数,再往上调用父类的析构函数 -
别让异常逃离析构函数
-
绝不在构造和析构过程中调用virtual函数
构造时,先基类,派生类还未构造,如果下降到更底层的虚函数,会产生未定义行为;
析构时,先派生类,来到基类时,派生类已经释放,如果下降也会产生未定义行为。 -
令 operator= 返回一个指向 *this 的引用
string, vector, shared_ptr都采用这个标准。 -
在 operator= 中处理“自我赋值”
证同测试 -
复制对象时勿忘其每一个成分
深拷贝 -
以对象管理资源
管理对象,工厂模式,RAII观念(资源取得时机就是初始化时机) -
在资源管理类中小心coping行为
禁止复制、引用计数法、复制底部资源、转移底部资源的拥有权 -
在资源管理类中提供对原始资源的访问
get()函数的设计,隐式转换更方便,显式转换更安全 -
成对使用 new 和 delete 时要采取相同形式
new[]和delete[]一一对应 -
以独立语句将newed对象置入智能指针
函数参数调用顺序不确定 -
让接口容易被正确使用,不易被误用
防止接口误用 -
设计 class 犹如设计 type
把class的设计当作新类型的设计,仔细思考所有的细节再做决定 -
宁传 const 引用也不要直接传值
临时对象 -
必须返回对象时,别妄想返回其引用
不要返回指向本地栈的指针或引用。 -
将成员变量声明为 private
private可保证客户访问数据的一致性,而protected的封装性不如public -
尽量用非成员、非友元函数替换成员函数
对于功能整合的便利函数,尽量写在class之外,namespace之内,增加封装性、可扩充性。 -
若所有参数都需要类型转换,请采用非成员函数
-
写出一个不抛出异常的swap函数
当std::swap()对自定义类型效率不高时,提供一个swap成员函数,并确定它不会抛出异常。 -
尽可能延后变量定义式的出现时间
-
尽量少做转型动作
const_cast() 常量性转除
dynamic_cast() 继承
reinterpret_cast() 低级转换
static_cast() 强制隐式转换 -
避免返回指向对象内部成分的句柄
帮助const成员函数的行为的确像个const。 -
为异常安全而努力是值得的
即使发生异常也不会泄露资源或破坏任何数据结构。 -
透彻了解 inline 的里里外外
stl::max()和stl::min()就是inline的。
class内成员函数默认内联。 -
将文件的编译依存关系降到最低
将一个class分割成两个class,一个只提供接口,另一个负责实现该接口,减少编译依赖关系。 -
确定 public 继承构成 is-a 关系
基类的每一件事情一定也要适用于派生类。 -
避免遮掩继承而来的名称
作用域问题。 -
区分接口继承和实现继承
纯虚函数:只指定接口继承
非纯虚函数:指定接口继承及缺省实现继承
非虚函数:指定接口继承及强制性实现继承 -
考虑 virtual 函数以外的其他选择
virtual函数的替代方案包括NVI手法以及多种设计模式。 -
绝不重新定义继承而来的非虚函数
-
绝不重新定义继承而来的缺省参数值
-
通过复合构造出 has-a 或 “根据某物实现出” 的结构
-
明智而审慎地使用private继承
-
明治而审慎地使用多重继承
多重继承:
单一继承: -
了解隐式接口和编译器多态
对于class,接口是显式的,多态通过虚函数发生于运行期;
对于template,接口是隐式的,多态通过template具现化和函数重载发生于编译器。 -
了解 typename 的双重意义
一般情况下和class等价。 -
学习处理模板化基类内的名称
-
将与参数无关的代码抽离 templates
-
运用成员函数模板接受所有兼容类型
-
需要类型转换时请为模板定义非成员函数
-
请使用 traits classes 表现类型信息
-
认识 template 元编程
-
了解new-handler的行为
-
了解new和delete的合理替换时机
重载new和delete运算符。 -
编写new和delete时需固守常规
-
写了placement new 也要写placement delete
-
不要轻忽编译器的警告
-
让自己熟悉包括 TR1 在内的标准程序库
智能指针,tr1::function,tr1::bind,tr1::unordered_set,正则表达式,tr1::tuple,
tr1::array,tr1::mem_fn,tr1::reference_wrapper,随机数,数学特殊函数,C99兼容。 -
让自己熟悉Boost