C++在类的构造函数中调用另一个构造函数
前言:
为了避免函数代码的重复,我们经常会遇到需要在一个构造函数中调用另一个函数的场景。
错误写法:
class MyClass {
public:MyClass(int x) {value = x;printf("Constructor A: %d\n", value);}MyClass() {// ❌ 错误:试图在函数体内调用另一个构造函数MyClass(42); // 这实际上是在函数体内创建了一个临时对象,不是委托!printf("Constructor B\n");}private:int value;
};
说明: 这里的MyClass(42)实际是构造了一个临时对象,当MyClass()完成退出时这个临时对象就会被销毁,就会调用MyClass的析构函数。而MyClass()中的原本需要构造的this对象并不会调用构造函数MyClass(42)。
正确写法:(使用委托函数)
class MyClass {
public:// 构造函数 AMyClass(int x) {// 初始化逻辑 Avalue = x;printf("Constructor A: %d\n", value);}// 构造函数 B,委托给构造函数 AMyClass() : MyClass(42) { // ✅ 委托给 MyClass(int)printf("Constructor B (default)\n");}private:int value;
};
上面实现的实际运行结果:
int main() {MyClass a; // 调用默认构造函数 MyClass() → 委托给 MyClass(42)MyClass b(10); // 调用 MyClass(int x)return 0;
}------------------------------
实际输出:
Constructor A: 42
Constructor B (default)
Constructor A: 10