条款01:视C++为一个语言联邦
将C++视为一个由相关语言(次语言)组成的联邦,而非单一语言
- C:C的语法,面向过程编程
- Object-Oriented C++(C with Classes):在C语言的基础上做的面向对象的扩展,封装、继承、多态,类的构造函数,析构函数,虚函数...面向对象编程
- Template C++:面向泛型编程
- STL:标准库
对于内置的数据类型(C-like),pass-by-value(传值)通常比pass-by-reference(传引用)高效,对于Object-Oriented C++用户自定义(user-defined)数据类型,pass-by-reference(传引用)通常比pass-by-value(传值)高效。
条款02:尽量以const, enum, inline替换#define
- #define ASPECT_RATIO 1.653---------->#define定义的ASPECT_RATIO在预处理阶段被预处理器替换掉,导致编译器编译出错时,并不会直接报ASPECT_RATIO有问题,而是报1.653有错误信息,追踪困难;对于单纯常量,最好以const对象或enum替换#define
- 对于类中的静态常量,常量声明在类的头文件中,常量定义以及赋予初值在类的实现文件中;如果编译器不支持类型静态常量初始化的话,对于需要使用静态常量的地方可以用enum(枚举类型)代替;
class GamePlayer
{
private:
static const int NumTurns = 5;//某些编译器可能不支持该操作“in class初值设置”
int scores[NumTurns];
};
//使用下边方法解决
class GamePlayer
{
private:
enum {NumTurns = 5};//使用枚举变量 “the enum hack”
int scores[NumTurns];
};
- 对于形似函数的宏(macros),最好改用inline函数替换#define
条款3:尽可能使用const
- 修饰指针时,const在*左侧表示指针指向的对象是常量,const在*右侧表示指针本身是一个常量(注意*的位置)
- const修改STL迭代器时,就好像T* const,要想表示迭代器指向的对象为常量,应该使用const_iterator
- const成员函数,允许类的const对象调用const成员函数,与mutable关键字搭配使用
- 当const版本和非const版本实现等价时----运用const成员函数,实现非const的孪生版本,如在constT& ::operator()[] const的基础上实现T& ::operator()[],主要通过const_cast<T&>(去除常量版本返回值的const)和static_cast<const Class&>(*this)(在非const的基础上调用const版本)实现,注意在const版本中调用非const版本是错误的
条款4:确定对象被使用前已被初始化
- 读取未初始化的值,可能会导致不确定的行为
- 对于不确定编译器是否会进行初始化动作的地方,最好手动进行初始化
- 对于类的成员变量而言,最好使用member initialization list代替在构造函数内部对成员变量进行赋值
- 在函数内定义的static变量,被称为local static对象,其他的static变量被称为non-local static对象,c++保证,定义在函数中的local static对象会在该函数首次被调用并遇上该对象的定义式时被初始化。对于non-local static对象(不同编译单元),c++没有规定其初始化顺序,一旦non-local static对象有依赖关系,没有办法确定non-local static对象按规定的顺序初始化