C++ 默认构造函数、拷贝构造函数和移动构造函数的区别

开发 前端
默认构造函数是没有任何参数的构造函数,或者所有参数都有默认值的构造函数。当我们创建一个对象时,若没有提供初始化参数,程序会调用默认构造函数进行初始化。 

构造函数三大类型,默认构造函数、拷贝构造函数和移动构造函数。 

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. 总结 

默认构造函数、拷贝构造函数和移动构造函数各自有不同的用途:  

默认构造函数:当我们创建一个对象时,它会被调用,进行默认初始化。 

拷贝构造函数:在需要复制对象时被调用,如对象传递、返回值传递等。 

移动构造函数:当传递或返回临时对象时使用,它通过“窃取”资源避免了复制,提升了性能。 

责任编辑:武晓燕 来源: CppPlayer
相关推荐

2024-12-06 12:00:00

C++构造函数

2014-05-29 10:54:20

C++构造函数

2010-01-28 10:49:22

C++构造函数

2023-11-28 11:51:01

C++函数

2022-07-26 00:36:06

C#C++函数

2011-07-20 13:40:09

拷贝构造函数

2009-08-13 17:30:30

C#构造函数

2010-07-20 09:52:27

Perl构造函数

2010-01-27 17:16:52

C++构造函数

2021-12-10 10:45:36

C++函数Stock

2009-08-14 17:24:28

C#构造函数和析构函数

2010-01-22 11:13:16

C++静态

2010-01-27 10:13:22

C++类对象

2010-01-25 14:00:27

C++类

2010-01-27 16:10:32

C++静态构造函数

2010-01-25 14:43:00

C++构造函数

2010-01-25 17:05:37

C++语言

2009-08-24 18:09:13

C#构造函数

2009-07-31 14:15:38

C# 构造函数

2009-07-31 16:06:50

成员函数构造函数C#
点赞
收藏

51CTO技术栈公众号