C++ 类之构造函数
在C++中,构造函数是用于初始化对象的特殊成员函数。构造函数有多种类型,包括默认构造函数、参数化构造函数、拷贝构造函数和移动构造函数。以下是对这些构造函数的详细总结和解释。
1. 默认构造函数
默认构造函数是在没有参数的情况下创建对象时调用的构造函数。如果没有显式定义,编译器会生成一个默认构造函数。
示例
1 2 3 4 5 6
| class MyClass { public: MyClass() { } };
|
2. 参数化构造函数
参数化构造函数允许在创建对象时传递参数,以初始化对象的成员变量。
示例
1 2 3 4 5 6 7 8 9 10
| class MyClass { public: MyClass(int x, double y) : a(x), b(y) { }
private: int a; double b; };
|
3. 拷贝构造函数
拷贝构造函数用于通过另一个同类型的对象来初始化新对象。它通常用于复制对象的资源。
示例
1 2 3 4 5 6 7 8 9 10
| class MyClass { public: MyClass(const MyClass& other) : a(other.a), b(other.b) { }
private: int a; double b; };
|
4. 移动构造函数
移动构造函数用于通过移动另一个同类型的对象来初始化新对象。它通常用于转移对象的资源,而不是复制它们。
示例
1 2 3 4 5 6 7 8 9 10 11 12
| class MyClass { public: MyClass(MyClass&& other) noexcept : a(other.a), b(other.b) { other.a = 0; other.b = 0.0; }
private: int a; double b; };
|
5. 析构函数
析构函数用于在对象生命周期结束时清理资源。它的名称与类名相同,但前面有一个波浪号(~
)。
示例
1 2 3 4 5 6
| class MyClass { public: ~MyClass() { } };
|
6. 完整示例
以下是一个包含所有类型构造函数和析构函数的完整示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream> #include <utility>
class MyClass { public: MyClass() : a(0), b(0.0) { std::cout << "Default constructor" << std::endl; }
MyClass(int x, double y) : a(x), b(y) { std::cout << "Parameterized constructor" << std::endl; }
MyClass(const MyClass& other) : a(other.a), b(other.b) { std::cout << "Copy constructor" << std::endl; }
MyClass(MyClass&& other) noexcept : a(other.a), b(other.b) { other.a = 0; other.b = 0.0; std::cout << "Move constructor" << std::endl; }
~MyClass() { std::cout << "Destructor" << std::endl; }
void print() const { std::cout << "a: " << a << ", b: " << b << std::endl; }
private: int a; double b; };
int main() { MyClass obj1; MyClass obj2(10, 20.5); MyClass obj3 = obj2; MyClass obj4 = std::move(obj2);
obj1.print(); obj2.print(); obj3.print(); obj4.print();
return 0; }
|
输出
1 2 3 4 5 6 7 8 9 10 11 12
| Default constructor Parameterized constructor Copy constructor Move constructor a: 0, b: 0 a: 0, b: 0 a: 10, b: 20.5 a: 10, b: 20.5 Destructor Destructor Destructor Destructor
|
总结
- 默认构造函数:在没有参数的情况下创建对象时调用。
- 参数化构造函数:允许在创建对象时传递参数,以初始化对象的成员变量。
- 拷贝构造函数:通过另一个同类型的对象来初始化新对象,通常用于复制对象的资源。
- 移动构造函数:通过移动另一个同类型的对象来初始化新对象,通常用于转移对象的资源。
- 析构函数:在对象生命周期结束时清理资源。