拷贝构造函数

拷贝构造函数

拷贝构造函数是一种特殊的构造函数,用于创建一个类的对象,并通过复制另一个相同类型的对象来初始化新对象。当以下几种情况发生时,会调用拷贝构造函数:

  • 通过使用另一个同类型的对象显式初始化新对象。
  • 将对象作为值参数传递给函数。
  • 从函数返回对象。
    拷贝构造函数通常接受一个对同类型对象的常量引用作为参数。

以下是一个C++示例,说明了拷贝构造函数的用法:

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
#include <iostream>

class Person {
public:
// 普通构造函数
Person(const std::string &name, int age) : name(name), age(age) {}

// 拷贝构造函数
Person(const Person &other) : name(other.name), age(other.age) {
std::cout << "拷贝构造函数调用\n";
}

// 输出Person信息的函数
void print() const {
std::cout << "姓名: " << name << ", 年龄: " << age << '\n';
}

private:
std::string name;
int age;
};

void displayPerson(Person person) { // 通过值传递,会调用拷贝构造函数
person.print();
}

int main() {
Person person1("张三", 25);
Person person2 = person1; // 调用拷贝构造函数
person2.print(); // 输出 张三, 25

displayPerson(person1); // 通过值传递,会调用拷贝构造函数

return 0;
}


在这个示例中,Person类具有一个拷贝构造函数,它接受另一个Person对象的引用,并通过复制其属性来初始化新对象。

请注意,在某些情况下,编译器可能会优化掉拷贝构造函数的调用(称为返回值优化或复制消除)。此外,如果未明确提供拷贝构造函数,编译器通常会生成一个默认的拷贝构造函数,该构造函数会执行成员逐一的拷贝。

如果你不想允许对象的拷贝操作,可以通过将拷贝构造函数声明为delete来禁用它:

1
2
Person(const Person &other) = delete;


这样会禁止编译器生成默认的拷贝构造函数,从而确保对象不能被复制。


拷贝构造函数
https://qiangsun89.github.io/2023/08/24/拷贝构造函数/
作者
Qiang Sun
发布于
2023年8月24日
许可协议