前言
如果一个类中重载了多个构造函数,并且在每个构造函数中都需要对某些变量进行初始化,这时候就会出现很多重复的代码,在C++11之前存在这个问题。而C++11中新增的委托构造函数,就是为了解决这个问题,它允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。
委托构造函数
我们先来看一个老版本的写法示例:
class ClassA{
public:
ClassA(){}
ClassA(int max){
m_max = max > 0 ? max : 20;
}
ClassA(int max,int min){
m_max = max > 0 ? max : 20;
m_min = min > 0 && min < m_max ? min : 5;
}
ClassA(int max,int min,int middle){
m_max = max > 0 ? max : 20;
m_min = min > 0 && min < m_max ? min : 5;
m_middle = middle < max && middle > min ? middle : 10;
}
private:
int m_max;
int m_min;
int m_middle;
};
以上示例只是为了展示在成员变量较多、初始化比较复杂的并且存在多个构造函数的情况下,每个构造函数都需要进行赋值,代码重复繁琐。
通过委托构造函数就可以简化这个过程:
class ClassA{
public:
ClassA(){}
ClassA(int max){
m_max = max > 0 ? max : 20;
}
ClassA(int max,int min):ClassA(max){
m_min = min > 0 && min < m_max ? min : 5;
}
ClassA(int max,int min,int middle):ClassA(max,min){
m_middle = middle < max && middle > min ? middle : 10;
}
private:
int m_max;
int m_min;
int m_middle;
};
需要注意的是,这种链式调用构造函数不能形成一个环,否则将会在运行时抛异常。
注意
注意:使用了委托构造函数后就不能用类成员初始化了。
如下:
class ClassA{
public:
ClassA(){}
ClassA(int max){
m_max = max > 0 ? max : 20;
}
//error
ClassA(int max,int min):ClassA(max),m_str("abc"){
m_min = min > 0 && min < m_max ? min : 5;
}
//只能通过成员赋值来初始化
ClassA(int max,int min):ClassA(max){
m_str = "abc";
m_min = min > 0 && min < m_max ? min : 5;
}
private:
int m_max;
int m_min;
string m_str;
};
以上写法会报错:error: an initializer for a delegating constructor must appear alone。
只能通过成员赋值来进行初始化。