📜  复制构造函数何时调用?(1)

📅  最后修改于: 2023-12-03 15:23:42.609000             🧑  作者: Mango

复制构造函数何时调用?

在C++中,复制构造函数(Copy Constructor)是一个特殊的构造函数,用于创建新对象,该新对象是使用相同类中的另一个对象的副本创建的。在这篇文章中,我们将讨论复制构造函数何时被调用以及如何使用它。

何时调用复制构造函数?

在以下情况下,复制构造函数将被调用:

  1. 当使用一个现有对象作为函数参数传递时,例如:

    void func(MyClass obj) {
        // ...
    }
    

    在此示例中,当调用 func() 时,将会复制传递给 func()obj,并使用该新对象调用复制构造函数。

  2. 当创建一个新对象,并初始化为另一个现有对象时,例如:

    MyClass obj1;
    MyClass obj2 = obj1;
    

    在此示例中,复制构造函数将被调用,将 obj1 的副本分配给 obj2

  3. 当使用一个对象初始化另一个对象的副本时,例如:

    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() 函数中,我们创建了三个对象:obj1obj2obj3obj2obj3 都是使用 obj1 的副本创建的。在构造和复制构造函数中,我们输出了每个对象的值。

当运行此示例时,输出如下:

Constructor called: 10
Copy constructor called: 10
Copy constructor called: 10
obj1.x: 10
obj2.x: 10
obj3.x: 10

从输出中可以看出,在创建 obj2obj3 时调用了复制构造函数,它们都使用 obj1 的副本初始化。然后,我们打印了每个对象的值。