1. 让自己习惯C++
1.1 条款01:视C++为语言联邦
1.1.1 C++的发展:
- 阶段1:C with Classes;
- 阶段2:加入异常(exceptions)、模板(templates)、STL库;
- 阶段3:过程形式 + 面向对象形式 + 函数形式 + 泛型形式 + 元编程形式
1.1.2 如何使用:视为四个次语言的组合
- C。最基础的C。
- 面向对象的C。C with Classes。
- Template C++。泛型编程,更深奥的还有模板元编程(TMP),但一般人用不到。
- STL。作者认为STL有自己的一套规约,可以单独拎出来。
1.2 条款02:尽量以const, enum, inline替换 #define
1.2.1 #define用于常量的场景
缺点:
- a. #define定义的常量导致编译出错时,出错提示不友好;
- b. #define无视作用域(scope),无封装性。
解决:
- a. 大多数情况可以用const替换;
- b. 旧编译器对类内static const语法较苛刻,此时可用enum替换#define。
1.2.2 $define用于宏(函数)的场景
缺点:
- a. 需要注意括号的使用,给自己添麻烦;
- b. #define无视作用域(scope),无封装性。
- 解决:使用inline函数。
1.3 条款03:尽可能使用const
- 原因:让编译器辅助对常量/常量函数的错误使用。
1.3.1 const常量
const char* p = ...; // p可改变,*p不可改变char const * p = ...; // 同上,有些人会这么写char* const p = ...; // p不可改变,*p可改变const char* const p = ...; // p不可改变,*p不可改变const std::vector<int>::iterator iter = ...; // iter不可改变,*iter可改变std::vector<int>::const_iterator iter = ...; // iter可改变,*iter不可改变const Rational operator* (const Rational& lhs, const Rational& rhs); // 用于避免出现 (a * b) = c 这样的代码
1.3.2 const函数
bool func(int a, int b) const; // const表示该函数不改变类中的成员变量,mutable修饰的成员变量除外