C++ 构造函数也能调用构造函数?——从 0 讲透“构造函数委托”
很多从 Java 转到 C++ 的同学,第一次看到这种代码都会懵:
Student(char* name) : Student(name, 87) {}
心里第一反应:
???构造函数还能调用构造函数?
答案是:可以,而且是官方支持的写法。
这个特性叫做 —— 构造函数委托(Delegating Constructor)
本文从 0 开始,一次性讲透。
一、什么是构造函数?
构造函数就是:
在创建对象时自动执行的函数,用来初始化成员变量。
示例:
class Student {
public:
int age;
Student(int a) {
age = a;
}
};
创建对象:
Student s(18);
这时构造函数自动执行。
二、为什么会有多个构造函数?
C++ 支持 构造函数重载:
class Student {
public:
char* name;
int age;
Student(char* n, int a) {
name = n;
age = a;
}
Student(char* n) {
name = n;
age = 87;
}
};
问题来了:
两个构造函数里都有:
name = n;
重复代码!
工程开发最怕的就是重复逻辑。
三、构造函数委托
C++11 引入了 构造函数委托,解决重复问题。
改写为:
class Student {
public:
char* name;
int age;
Student(char* n, int a) {
name = n;
age = a;
cout << "两个参数构造
";
}
Student(char* n) : Student(n, 87) {
cout << "一个参数构造
";
}
};
重点:
Student(char* n) : Student(n, 87)
意思:
我这个构造函数不自己初始化,
我去调用另一个构造函数完成初始化。
四、执行顺序是怎样的?
当执行:
Student s("Tom");
实际流程:
- 进入
Student("Tom", 87) - 初始化成员变量
- 打印“两个参数构造”
- 返回
Student(char*) - 执行函数体
- 打印“一个参数构造”
输出顺序:
两个参数构造
一个参数构造
五、和 Java 的对比
Java 写法
Student(String name) {
this(name, 87);
}
C++ 写法
Student(char* name) : Student(name, 87) {}
语义几乎完全一样。
六、IDE 里的 age:87 是什么?
你可能看到过:
Student(name, age:87)
注意:
age:不是 C++ 语法
是 IDE 的参数提示(Inlay Hint)
真实代码只有:
Student(name, 87)
七、一个非常重要的限制
当使用构造函数委托时:
初始化列表里 只能写这一项
错误写法:
Student(char* n) : Student(n, 87), age(10) {}
正确写法:
Student(char* n) : Student(n, 87) {}
因为初始化已经交给另一个构造函数了。
八、和成员初始化列表的区别
成员初始化列表
Student(char* n, int a) : name(n), age(a) {}
这是在初始化 成员变量
构造函数委托
Student(char* n) : Student(n, 87) {}
这是在调用 另一个构造函数
两者不是一回事。
九、什么时候该用?
适合场景:
- 多个构造函数逻辑相似
- 有默认值
- 想减少重复代码
- 想统一初始化入口
不适合场景:
- 每个构造函数逻辑完全不同
- 不存在共享初始化逻辑
十、一句话总结
构造函数委托 = 一个构造函数调用另一个构造函数
目的:减少重复初始化代码
类似 Java 的this(...)
你可以把它理解成:
“哥们你先帮我把对象初始化好, 我回来补两句业务逻辑。”理解到这一层,C++ 构造函数就彻底通了。







