C++11 委托构造函数和继承构造函数
C++11 引入了两个重要的构造函数特性:委托构造函数(Delegating Constructors)和继承构造函数(Inheriting Constructors)。这两个特性都旨在减少代码重复,提高代码的可维护性和可读性。
委托构造函数(Delegating Constructors)
委托构造函数允许一个构造函数调用同一个类的另一个构造函数,从而避免在多个构造函数中重复相同的初始化代码。
基本语法
1 | class MyClass { |
委托构造函数的执行顺序
1 | class Example { |
注意事项
不能形成循环委托:
1
2
3
4
5class Bad {
public:
Bad(int x) : Bad() {} // 错误:形成循环委托
Bad() : Bad(10) {} // 错误:形成循环委托
};委托构造函数不能同时使用成员初始化列表:
1
2
3
4
5
6
7class Invalid {
private:
int x, y;
public:
Invalid(int a) : x(a), Invalid() {} // 错误:不能同时委托和初始化成员
};
实际应用场景
委托构造函数特别适用于需要多种初始化方式的类:
1 | class Rectangle { |
继承构造函数(Inheriting Constructors)
继承构造函数允许派生类直接继承基类的构造函数,而不需要在派生类中重新声明和定义它们。
基本语法
1 | class Base { |
继承构造函数的特点
选择性继承:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Base {
public:
Base(int x) {}
Base(double y) {}
Base(int x, int y) {}
};
class Derived : public Base {
public:
using Base::Base; // 继承所有构造函数
// 如果定义了相同签名的构造函数,会覆盖继承的版本
Derived(int x) : Base(x) {
std::cout << "Derived 的 int 构造函数" << std::endl;
}
};与默认构造函数的关系:
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Base {
public:
Base(int x) {}
// 注意:没有默认构造函数
};
class Derived : public Base {
public:
using Base::Base;
// Derived 也不会有默认构造函数
};
// Derived d; // 错误:没有默认构造函数
Derived d(42); // 正确
实际应用场景
继承构造函数在扩展现有类时特别有用:
1 | // 基础日志类 |
组合使用委托构造函数和继承构造函数
1 | class Base { |
总结
- 委托构造函数:减少同一类中多个构造函数的代码重复
- 继承构造函数:简化派生类对基类构造函数的继承
- 两者都提高了代码的可维护性和可读性
- 在现代 C++ 开发中,应该充分利用这些特性来编写更清洁的代码
这些特性使得 C++11 在构造函数设计方面更加灵活和强大,是现代 C++ 编程的重要工具。