委托构造函数
C++11新标准定义了委托构造函数,扩展了构造函数对数据成员初始化的方法。所谓委托构造就是让类中的某个构造函数去委托另一个构造函数执行构造操作的机制。一个委托构造函数使用它所属类的其他构造函数执行自己的初始化过程。
C++11标准之前的规范没有提供让一个构造函数去委托另一个构造函数执行构造操作的机制,类的编写者需要根据实际要求编写多个具有不同参数的构造函数,这样就可能导致代码的重复。例如有如下代码:
class X{
public:
int a, b;
void init(int x, int y) { a = x, b = y; }
public:
//构造函数调用init函数完成数据初始化
X(){ init(5, 10); }
X(int x) : a(x), b(10) { init(x, 10); }
X(int x, int y) :a(x), b(y){ init(x, y); }
};
上述代码中定义了三个构造函数,都用init()函数完成了数据成员的初始化,构造函数代码重复。
为了简化操作,C++11标准引入了委托构造函数,可以在初始化列表中调用本类的另一个构造函数,完成数据成员的初始化,即委托构造函数把数据成员的初始化委托给另一个构造函数,然后再取回控制权,执行其它操作。修改上述代码,使用委托构造函数进行初始化,代码如下所示:
class X{
private:
int a, b;
public:
X(int x, int y) :a(x), b(y){ }
//委托构造函数,委托带参数的构造函数完成数据成员初始化
X():X(5, 10){ }
X(int x):X(x, 10){}
};
在上述代码中不带参数和带有一个整型参数的构造函数是委托构造函数,它们将数据成员的初始化操作都委托给了带有两个整型参数的构造函数,被委托的构造函数称为目标构造函数。目标构造函数还可以再委托给另一个构造函数。如果存在递归循环(如构造函数C1委托给另一个构造函数C2,而C2又委托给C1),则行为未定义。
委托构造函数体中的语句在目标构造函数完全执行后才被执行。目标构造函数体中的局部变量不在委托构造函数体中起作用。