C++11中引入的委托构造函数是一种允许构造函数在同一个类中调用另一个构造函数的特性。这样做的主要目的是减少代码重复,提高代码的复用性和清晰度。在C++11之前,如果你有多个构造函数,它们之间有共同的初始化代码,你不得不在每个构造函数中重复这些代码。委托构造函数允许你将共同的初始化代码放在一个构造函数中,然后让其他构造函数调用这个构造函数,从而避免代码重复。
基本语法
委托构造函数的基本语法如下:
class ClassName {
public:
ClassName() : ClassName(参数列表) { // 委托给另一个构造函数
// 额外的初始化代码(如果有的话)
}
ClassName(参数类型 参数名) { // 被委托的构造函数
// 初始化代码
}
};
示例
考虑以下示例,其中一个类有三个构造函数,每个构造函数都需要执行一些共同的初始化操作:
class MyClass {
public:
MyClass() : MyClass(0) { // 委托给 MyClass(int)
// 这里可以进行额外的初始化
}
MyClass(int value) : value(value) { // 被委托的构造函数
// 进行初始化
}
MyClass(int value, std::string name) : MyClass(value) { // 委托给 MyClass(int)
this->name = name;
// 进行额外的初始化
}
private:
int value;
std::string name;
};
在这个例子中,无参构造函数MyClass()
和接受int
和std::string
的构造函数MyClass(int, std::string)
都委托给了接受int
参数的构造函数MyClass(int)
来进行初始化。这样,所有构造函数共有的初始化代码只需要在MyClass(int)
中编写一次,避免了代码重复。
注意事项
- 循环委托:在使用委托构造函数时,需要注意避免构造函数之间形成循环调用,这会导致编译错误。
- 委托与成员初始化列表:在委托构造函数中,被委托的构造函数的初始化列表会首先被执行,然后才是委托构造函数自身的花括号内的代码。
- 构造函数的选择:委托构造函数的选择是基于参数类型匹配的,因此需要确保正确地指定参数,以调用期望的构造函数。
委托构造函数是C++11中引入的一个非常有用的特性,它可以使构造函数的编写更加灵活和清晰。