博客好久没更新了,就从这本读书笔记开始吧。
条款01: 视C++为一个语言联邦
C++可视为有四个次语言组成的:
1、C语言
2、Object-Oriented C++ (面向对象C++)
3、Template C++(模版C++)
4、STL (标准模版库)
条款02:尽量以const, enum, inline替换#define
该条款中提到的const, enum, inline 替换#define主要是两个维度。 一个是数据,一个是函数。
1、使用const代替宏定义很容易理解, 另外该条款中提到了在类内部使用声明式声明一个成员变量而省去在cpp文件中定义的方式,即
static const int/char/unsigned 等整数类型的const static 成员变量可以省去在cpp文件中的定义,还有一个约束就是不去取该成员的地址。
2、使用enum代替宏定义时,可以在类内部使用一个匿名枚举代替宏定义的常量,比如作为数组大小时使用。
3、使用inline代替宏定义,这一点主要是说的函数宏定义
使用宏定义函数时,好处是省去函数调用的开销,缺点也很明显,比如定义结构不清晰,参数求值的副作用等等。
条款03:尽可能使用const
const可以用来修饰 指针 / 迭代器 / 引用 / 参数 / 返回值 / 函数类型
尽可能的使用const可以借助编译器检查出一些编译阶段的错误。
当const成员函数和非const成员函数有着实质等价的实现时,用非const版本调用const版本可以避免代码重复。
编译器强制实时【二进制常量】,例如const成员变量不会允许被赋值。 而【逻辑上的常量】需要自己根据实际情况来决定。
条款04:确定对象使用前已被初始化
内置类型成员变量的初始化、类对象成员的成员变量的初始化等,建议都是用初始化列表进行初始化,使用初始化而非赋值。
在初始化列表中进行初始化的的顺序:基类优先、其他成员按照在类中声明的次序。
关于:non-local static对象
a.cpp
static CObject s_obj; // 非局部静态对象
b.cpp
在b.cpp中使用对象s_obj时,不能保证在使用的时候,s_obj对象一定被初始化了。
可以改为如下
a.cpp
CObject& GetObject()
{
static CObject s_obj;
return s_obj;
}
b.cpp
调用GetObject() 获取s_obj对象。