📅  最后修改于: 2023-12-03 15:23:42.609000             🧑  作者: Mango
在C++中,复制构造函数(Copy Constructor)是一个特殊的构造函数,用于创建新对象,该新对象是使用相同类中的另一个对象的副本创建的。在这篇文章中,我们将讨论复制构造函数何时被调用以及如何使用它。
在以下情况下,复制构造函数将被调用:
当使用一个现有对象作为函数参数传递时,例如:
void func(MyClass obj) {
// ...
}
在此示例中,当调用 func()
时,将会复制传递给 func()
的 obj
,并使用该新对象调用复制构造函数。
当创建一个新对象,并初始化为另一个现有对象时,例如:
MyClass obj1;
MyClass obj2 = obj1;
在此示例中,复制构造函数将被调用,将 obj1
的副本分配给 obj2
。
当使用一个对象初始化另一个对象的副本时,例如:
MyClass obj1;
MyClass obj2(obj1);
在此示例中,将使用复制构造函数将 obj1
的副本赋值给 obj2
。
复制构造函数有一个特殊的参数,即 const&
类型的另一个对象。该参数指定了要复制的对象。
以下是一个使用复制构造函数的示例:
#include <iostream>
class MyClass {
public:
int x;
MyClass(int n) : x(n) {
std::cout << "Constructor called: " << x << std::endl;
}
MyClass(const MyClass& obj) : x(obj.x) {
std::cout << "Copy constructor called: " << x << std::endl;
}
};
int main() {
MyClass obj1(10);
MyClass obj2 = obj1;
MyClass obj3(obj1);
std::cout << "obj1.x: " << obj1.x << std::endl;
std::cout << "obj2.x: " << obj2.x << std::endl;
std::cout << "obj3.x: " << obj3.x << std::endl;
return 0;
}
在此示例中,MyClass
有一个带整数参数的构造函数和一个带 const&
类型参数的复制构造函数。在 main()
函数中,我们创建了三个对象:obj1
、obj2
和 obj3
。obj2
和 obj3
都是使用 obj1
的副本创建的。在构造和复制构造函数中,我们输出了每个对象的值。
当运行此示例时,输出如下:
Constructor called: 10
Copy constructor called: 10
Copy constructor called: 10
obj1.x: 10
obj2.x: 10
obj3.x: 10
从输出中可以看出,在创建 obj2
和 obj3
时调用了复制构造函数,它们都使用 obj1
的副本初始化。然后,我们打印了每个对象的值。