C++11委托构造函数与继承构造函数
请解释C++11中委托构造函数(Delegating Constructor)和继承构造函数(Inheriting Constructor)的语法、作用,以及使用时需注意的循环委托和初始化顺序问题。
回答
我还是少年
委托构造函数:一个构造函数调用本类的另一个构造函数,避免代码重复。
class MyClass {
int a; double b;
public:
MyClass(int x, double y) : a(x), b(y) { /*公共初始化*/ }
MyClass(int x) : MyClass(x, 0.0) { /*委托给双参版本*/ }
MyClass() : MyClass(0) { /*委托链*/ }
};
注意:
- 委托后目标构造函数的初始化列表已经完成,当前构造函数不能再有成员初始化列表(只能委托)。
- 防止循环委托(编译报错)。
- 成员初始化顺序由声明顺序决定,而非委托顺序。
继承构造函数(C++11):派生类可通过using Base::Base;导入基类的所有构造函数(除拷贝/移动外)。
struct Base { Base(int); Base(double); };
struct Derived : Base {
using Base::Base; // 继承Base的两个构造函数
Derived(int x, int y) : Base(x), extra(y) {} // 也可自定义
int extra = 0;
};
注意:继承构造函数不会自动匹配派生类新增加的成员初始化。