1. 习惯C++编程范式
1.1 视 C++ 为一个语言联邦
C++作为一门多范式编程语言,其复杂性往往让初学者望而生畏。Scott Meyers在《Effective C++》中提出的"语言联邦"概念,为我们理解C++提供了绝佳的视角。这个联邦由四个主要子语言组成:C、Object-Oriented C++、Template C++和STL。
C子集构成了C++的基础层。在这个层面,程序员需要关注内存布局、指针运算和底层性能优化。例如,理解以下C风格代码的内存行为至关重要:
cpp复制int* arr = (int*)malloc(10 * sizeof(int));
arr[0] = 42; // 直接内存操作
free(arr);
**面向对象C++**引入了类、继承和多态等概念。这时我们需要关注封装、接口设计和虚函数机制。典型的面向对象代码可能如下:
cpp复制class Shape {
public:
virtual double area() const = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
double radius;
public:
explicit Circle(double r) : radius(r) {}
double area() const override { return 3.14 * radius * radius; }
};
**模板C++**开启了元编程的大门。模板不仅仅是泛型编程工具,还能实现编译期计算。考虑这个简单的模板示例:
cpp复制template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
// 特例化版本
template<>
const char* max<const char*>(const char* a, const char* b) {
return strcmp(a, b) > 0 ? a : b;
}
STL则提供了强大的算法和容器库。熟练使用STL能极大提升开发效率:
cpp复制std::vector<int> vec{1, 2, 3};
std::transform(vec.begin(), vec.end(), vec.begin(),
[](int x) { return x * 2; });
提示:在实际开发中,明确当前使用的C++子语言范式,能帮助选择最合适的编程风格和最佳实践。
1.2 尽量以 const、enum、inline 替换 #define
宏定义是C时代的产物,在现代C++中应当谨慎使用。宏的主要问题在于它只是简单的文本替换,不参与类型系统和作用域规则。
常量定义应当优先使用constexpr:
cpp复制// 不好的做法
#define PI 3.14159
// 好的做法
constexpr double Pi = 3.14159;
类内常量可以使用static constexpr:
cpp复制class Buffer {
public:
static constexpr int DefaultSize = 1024;
char data[DefaultSize];
};
函数宏应当用内联函数替代:
cpp复制// 不好的做法
#define SQUARE(x) ((x)*(x))
// 好的做法
inline int square(int x) { return x * x; }
// 更好的做法(C++11起)
constexpr auto square(auto x) { return x * x; }
*枚举值
