构造函数三大类型,默认构造函数、拷贝构造函数和移动构造函数。
1.默认构造函数 (Default Constructor)
默认构造函数是没有任何参数的构造函数,或者所有参数都有默认值的构造函数。当我们创建一个对象时,若没有提供初始化参数,程序会调用默认构造函数进行初始化。
特点:
默认构造函数不需要参数,或者所有参数都有默认值。
如果没有显式定义,编译器会自动生成一个默认构造函数(如果没有其他构造函数的话)。
它用于初始化对象的成员变量,并确保对象处于有效状态。
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默认构造函数
cout << "Default constructor called!" << endl;
}
};
int main() {
MyClass obj; // 创建对象时调用默认构造函数
return 0;
}
输出:
Default constructor called!
在这个示例中,我们定义了一个名为 MyClass 的类,并实现了一个默认构造函数。当我们创建 obj 对象时,程序自动调用了默认构造函数。
2. 拷贝构造函数 (Copy Constructor)
拷贝构造函数用于通过现有对象来创建一个新的对象。它通常用于对象的复制操作,例如将一个对象传递给函数、或者返回一个对象时。
特点:
拷贝构造函数接受一个类的常量引用作为参数。
它的作用是通过另一个对象的内容来初始化新对象。
当对象被复制时,编译器自动调用拷贝构造函数。
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默认构造函数
cout << "Default constructor called!" << endl;
}
MyClass(const MyClass& other) { // 拷贝构造函数
cout << "Copy constructor called!" << endl;
}
};
int main() {
MyClass obj1; // 调用默认构造函数
MyClass obj2 = obj1; // 调用拷贝构造函数
return 0;
}
输出:
Default constructor called!
Copy constructor called!
在这个示例中,我们创建了一个对象 obj1,并将其传递给 obj2,这时会调用拷贝构造函数来创建一个新的对象 obj2,并复制 obj1 的内容。
3. 移动构造函数 (Move Constructor)
移动构造函数用于通过转移资源来构造对象,避免不必要的资源复制。在某些情况下,当我们传递临时对象或者即将销毁的对象时,移动构造函数会“窃取”对象的资源,而不是进行复制操作。这种方式大大提高了程序的性能,尤其是在处理大对象或动态内存分配时。
特点:
移动构造函数接受一个右值引用作为参数。
它会将资源从一个对象转移到另一个对象,而不是复制资源。
移动构造函数通常用于处理临时对象或返回对象。
示例:
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass() { // 默认构造函数
cout << "Default constructor called!" << endl;
}
MyClass(MyClass&& other) { // 移动构造函数
cout << "Move constructor called!" << endl;
}
};
MyClass createObject() {
MyClass temp;
return temp; // 移动构造函数被调用
}
int main() {
MyClass obj = createObject(); // 使用移动构造函数
return 0;
}
输出:
Default constructor called!
Move constructor called!
在这个示例中,createObject 函数返回一个 MyClass 对象。当 temp 返回时,程序会调用移动构造函数,因为 temp 是一个临时对象。通过移动构造函数,obj 将直接接管 temp 的资源,而无需复制资源。
4. 总结
默认构造函数、拷贝构造函数和移动构造函数各自有不同的用途:
默认构造函数:当我们创建一个对象时,它会被调用,进行默认初始化。
拷贝构造函数:在需要复制对象时被调用,如对象传递、返回值传递等。
移动构造函数:当传递或返回临时对象时使用,它通过“窃取”资源避免了复制,提升了性能。