条款01 - 视C++为一个语言联邦
C++ 由四个次语言构成
1 . 说到底C++仍是以C为基础
区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)都来自与C
2. Object-Oriented C++(面向对象)
classes(包括构造函数和析构函数),封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)……等等。
3. Template C++ (模板)
C++ 泛型编程
4. STL
STL 是个template程序库
条款02 - 尽量以const,enum,inline替换#define
原因1是#define不被看作语言的一部分,导致你所使用名称可能并未进入记号表
原因2预处理器盲目地将宏名称替换,可能导致出现多份替换后的值,而用常量就不会出现这个原因
原因3因为#define实现宏看起来像函数,但会带来额外开销,用template inline 取代
特殊情况
1. 定义常量指针时 不止是要将指针所指声明为const 还要将指针本身定义为const
const char * const MyName = "Liu Rongfa "
// const 两次
2. class 专属常量还必须加一个static ,#define 不能创建class专属变量,因为define不注重作用域
class LRF{
private :
static const int a = 1;
int s[a] ;
}
特特殊情况 Class 编译期间需要一个class 常量值
使用enum hack ,一种枚举类型,比较像#define
条款03 -
原因
- 使用const会告诉编译器和程序员某值应保持不变,如果被修改可以被编译器发现,并且const的应用范围很广,可以修饰i文件函数区块等等
- 如果关键字const 出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
- const最具威力的用法是面对函数声明时的应用。在一个函数声明式内,const可以和函数返回值、各参数、函数自身(如果是成员函数)产生关联。
- 当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。
const 成员函数意味着什么
- bitwise constness认为不改变任何成员变量才可以说是const
- logical constness 一个const成员函数可以修改它所处理的对象内的某些bit,但只有在客户端侦测不出的情况下才可如此。
条款04 - 确定对象被使用前已被初始化
原因 : 读取未初始化的值会导致不明确的行为
1.对于无任何成员的内置类型,必须手工初始化
2. 不要搞混初始化和赋值,构造函数尽量使用初始化列表
因为1.赋值操作会多创建变量
因为2.内置类型不能被赋值,只能被初始化
3. 用local static对象替换non-local static对象来避免跨编译单元之初始化次序”问题
- local static:函数内的static对象。
- non-local static:其他static对象。
- 编译单元:产出单一目标文件的源码(单一源码文件加上include的头文件)。