1. 常成员与静态成员的深度解析
常成员和静态成员是C++中两个容易被混淆但又至关重要的概念。先说常成员,它分为常数据成员和常成员函数。常数据成员必须在构造函数的初始化列表中完成初始化,之后就不能再修改。我见过不少新手直接在构造函数体内初始化常成员,结果编译报错。正确的做法是这样的:
cpp复制class Circle {
public:
Circle(double r) : radius(r) {} // 正确:在初始化列表初始化
private:
const double radius; // 常数据成员
};
常成员函数则承诺不会修改对象状态,所以它只能调用其他常成员函数。这里有个坑:常成员函数和非const成员函数可以构成重载。比如void print() const;和void print();是两个不同函数,const对象会调用前者,非const对象优先调用后者。
静态成员属于类而非对象,所有对象共享同一份静态成员。静态数据成员必须在类外初始化(除了const static整型可以在类内初始化)。我曾经在一个项目中忘记初始化静态成员,导致运行时出现诡异错误。正确的初始化方式:
cpp复制class Counter {
public:
static int count; // 声明
};
int Counter::count = 0; // 定义并初始化
静态成员函数没有this指针,所以只能访问静态成员。但有个技巧:可以通过传递对象参数来访问非静态成员。比如:
cpp复制class Utils {
public:
static void print(const MyClass& obj) {
cout << obj.data; // 通过参数访问非静态成员
}
};
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 虚函数与多态的实现机制
虚函数是C++实现多态的核心机制。当类中包含虚函数时,编译器会为该类生成一个虚函数表(vtable),每个对象则包含一个指向vtable的指针(vptr)。这个设计让我想起之前调试的一个bug:在基类构造函数中调用虚函数,结果没有按预期执行多态行为。原因是在构造基类时,派生类部分还未构造,vptr指向的是基类的vtable。
纯虚函
