条款01 视C++为一个语言联邦
将C++看成一个语言联邦 由4种次语言组成 将4种次语言单独分离开来看
- C语言
- Object-Oriented C++ (面向对象)
- Template C++ C++泛型编程的部分组成
- STL
条款02 尽量使用const,enum,inline替换#define
- 对于纯常量 用const对象或enums替换#define
- 对于形似函数宏,用inline函数替换#defines
cpp #define ASPECT_RATIO 1.653
这样写可能造成如下错误和模糊
- 记号名称ASPECT_RATIO可能从未被编译器看见,记号可能不能进入symbol table
解决之道
cpp const double ASPECT_RATIO = 1.653;
当以常量替换#define有如下情况值得提及
- 定义常量指针
- class的专属常量
class Game{
private:
static const int NumTurns = 5;//常量声明式
int score[NumTurns];
public:
const int * address = &NumTurns;
};
//当我们需要取常量的地址或者想看到常量的定义时对其进行定义
const int Game::NumTurns ; // 声明式
tips:
- #define不能用来定义class的专属常量也不能提供任何的封装性
the enum hack
class Game{
private:
enum {NumTurns = 5};
int score[NumTurns];
};
- 某种意义下enum更像#define而不像const 取一个const地址合法 而取一个enum不合法
- template programming 基础技术就是enum hack
用inline替换#define
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
int a = 5, b = 0;
CALL_WITH_MAX (++a, b); //a 被累加二次
CALL_WITH_MAX(++a, b+lO);//a 被累加一次
这么恶心的东西狗都不用
template<typename T> //由于我们不知道
inline void callWithMax(cons T& a, canst T& b) / /T 是什么,所以采用 / /pass by reference-to-const.
{
f (a > b ? a : b); //见条款 20.
}
条款03 尽量使用const
const指针
- const出现在星号左边表示指针所指的量不可改变,出现在右边表示指针自身的值不可改变
- STL中迭代器也是模拟指针实现的
const vector<int> :: iterator iter //类似T * constvector<int> :: const_iterator iter // 类似 const T * - 让函数返回一个常量值,往往可以降低因为客户错误而造成的意外
const成员函数
作用
- 使class接口比较容易理解
- 使操作const对象成为可能
条款4 确定对象被使用前已先被初始化
- 为内置类型对象进行手工初始化
- 构造函数最好使用成员初始列,而不要在构造函数中进行赋值操作.初始列列出的成员变量,其排列次序应该和它们在class中声明次序相同
- 为避免"跨编译单元之初始化次序问题",用local static对象替换non-local static对象