委托构造函数
C++11 中引入了一个很有用的特性:委托构造函数。这为构造函数提供了强大的便捷性,能够通过一个构造函数委托另一个构造函数的实现,避免重复代码。
C++11 之前的做法
在 C++11 之前,如果需要为不同的构造需求提供多个构造函数,通常需要在每个构造函数中重复实现其他构造函数的初始化逻辑。
例如:
class MyClass {
public:
// 基本构造函数
MyClass(int a, int b) {
x = a;
y = b;
}
// 重复初始化逻辑
MyClass(int a) {
x = a;
y = 0;
}
// 重复初始化逻辑
MyClass() {
x = 0;
y = 0;
}
private:
int x, y;
};
这种做法导致重复代码,如果初始化逻辑需要修改,则需要在所有构造函数中重复修改。
C++11 委托构造的使用
C++11 引入了委托构造,可以大大减少重复代码。通过委托构造,一个构造函数可以调用另一个构造函数,实现已有代码的重复使用。
示例:
class MyClass {
public:
// 基本构造函数
MyClass(int a, int b) : x(a), y(b) {}
// 委托构造函数
MyClass(int a) : MyClass(a, 0) {}
// 委托构造函数
MyClass() : MyClass(0, 0) {}
private:
int x, y;
};
示例解释
在上面的示例中:
-
基本构造函数
MyClass(int a, int b)
创建了实际的初始化逻辑:传入两个参数并为私有成员x
和y
赋值。 -
构造函数
MyClass(int a)
委托到基本构造函数,将第二个参数设为默认值0
。 -
构造函数
MyClass()
委托到基本构造函数,将全部参数设为默认值0
。
委托构造的优点
-
避免重复代码: 委托构造可以将一些共同的初始化逻辑放到一个构造函数中,其他构造函数通过委托调用。
-
提高可维护性: 如果优化或修改初始化逻辑,只需要修改基础构造函数,无需更改其他委托构造。
-
便于阅读: 通过委托构造,可以清晰地看出构造函数之间的关系,使代码更加清晰明了。
注意事项
-
委托构造只能在构造函数列表中调用,不能在构造函数体内调用。
-
委托构造可能会增加一些性能消耗。性能消耗的原因在于:
- 每次委托调用都会导致额外的函数调用栈层级。这可能会引入一些开销,尤其是在构造函数的调用链较长的情况下。
- 编译器可能无法完全优化委托调用,尤其是在一些复杂场景中,这可能会增加运行时的额外负担。
-
大多数场景下无需担心性能问题: 通常情况下,委托构造的性能消耗是可以忽略不计的。只有在性能要求极高的场景下,才需要针对委托调用进行优化。
通过委托构造,我们可以让 C++ 代码更加简洁、可维护。