条款01:视C++为一个语言联邦
分为 C 、Object-Oriented C++、Template C++、STL
条款02:尽量以const、enum、inline 替换#define
1、
2、认识enum hack
对于单纯常量,最好以const对象或者enum替代#define。
对于形似函数的宏,最好改用inline函数替代#define。
条款03:尽可能使用const
1、const char* p、char* const p、const char* const p
const char* p = “hello”; //non-const pointer, const data
char* const p = “hello”;// const pointer, non-const data
const char* const p = “hello”;//const pointer, const data
2、STL迭代器和const的关联
声明迭代器为const就像声明指针为const一样(即声明一个T* const 指针)
3、const 修饰函数返回值、函数参数、成员函数
(1) 函数返回值
对两个自定义对象进行乘积,返回值是const对象,属于右值,不能被修改,可以避免意外错误。
(2)参数
(3)成员函数
将const作用于成员函数的目的,是为了确认该成员函数可作用于const对象身上。
改善C++程序效率的一个根本办法是prefer pass-by reference-to-const to pass-by-value, 即进行常引用传递而不是值传递 (const T& t)
在const 和 non-const 成员函数中避免重复
static_cast使得non-const对象转为const对象,从而调用const成员函数 const operator[ ],const_cast则从调用的const operator[ ]得到的返回值中移除const。
4、总结
条款04:确定对象被使用前已被初始化
1、永远在使用对象之前先将它初始化
对于无任何成员的内置类型,必须手动初始化。例如
int a = 2; const char* p = “hello”;
而对于非内置类型即自定义类型的初始化,责任则落实到构造函数身上,规则很简单:确保每一个构造函数都将对象的每一个成员初始化。
注意区分初始化和赋值,C++规定对象的成员变量初始化动作发生在进入构造函数本体之前。
可以使用member initialization list(初始化列表)来进行初始化,避免赋值。
基类总是先于派生类被初始化,而类的成员变量总是以其声明次序被初始化。
2、C++对于定义于不同编译单元内的non-local static 对象的初始化次序并无明确定义
如何解决这个问题?
将non-local static 对象搬到自己的专属函数内(该对象在此函数内被声明为static),这些函数返回一个reference 指向它所含的对象。也就是说将local static对象替换non-local static 对象。
也就是说他们使用函数返回的 指向static对象的 reference,而不再是使用static对象本身。