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 修饰的成员变量除外
-