1. View C++ as a federation of languages 视 C++ 为一个语言联邦
C++ 不是'单一规则的语言',而是由 4 个核心'子语言'组成的联邦,每个子语言有专属规则和适用场景,理解这一点能避免用'单一思维'写 C++:
- C 子语言:继承自 C 的过程式编程,适用于底层高效代码(如内存操作、简单算法),遵循 C 的语法和性能规则(比如指针、数组、宏)。
- 面向对象 C++:基于 C 添加类、继承、多态等特性,适用于封装、抽象、复用的场景(比如业务逻辑的类设计)。
- 模板 C++(泛型):支持通用编程,适用于编写不依赖具体类型的代码(比如容器、算法),甚至衍生出'模板元编程(TMP)'(进阶特性,新手暂无需深入)。
- STL:基于模板实现的标准库(容器、算法、迭代器),是 C++ 的'工具集',适用于数据处理(比如用
vector替代原生数组)。
核心价值:写 C++ 时不用'一刀切'—— 比如底层逻辑用 C 风格保证效率,业务层用面向对象保证复用,数据处理用 STL 减少重复代码。
2. Prefer const, enums, and inlines to #define 尽量用 const、enum、inline 替代 #define
#define 是预处理器指令(编译前替换),存在无类型检查、调试困难、副作用等问题,替代方案更安全、易维护:
| 场景 | #define 方案(问题) | 替代方案(优势) |
|---|---|---|
| 定义常量 | #define RATIO 1.653(无类型、不进符号表) | const double RATIO = 1.653(类型安全、可调试);class 内用 static const/enum(作用域隔离) |
| 类专属常量(旧编译器) | 无法限定作用域 | enum { NumTurns = 5 }(模拟常量,无内存开销,不可取地址) |
| 形似函数的宏 | #define MAX(a,b) f(a>b?a:b)(参数副作用) | template<class T> inline void max(T&a,T&b)(无副作用、类型检查、内联高效) |
#define ASPECT_RATIO 1.653 // 当使用这个宏时,它也许从未被编译器看见过,因为也许在编译器处理之前,它以及被预处理器移走了,不利于追踪调试 (ASPECT_RATIO 可能未进入记号表)
// 解决之道是以一个常量来替代
const double ASPECT_RATIO_THRESHOLD = 0.75;
// 当然也有特殊情况
// 一是定义常量指针的时候
const char* const authorName = "John Doe"; // 更推荐 std::string
{
:
NumTurns = ;
scores[NumTurns];
};

