为什么需要复制构造函数,它们在哪些情况下非常有用?

Sid*_*ant 1 c++ copy-constructor

为什么我们需要复制构造函数?

我正在学习 C++,但我无法理解复制构造函数的必要性,因为也没有使用复制构造函数,我得到了正确的输出。我经历了几个例子,但在我看来,拥有复制构​​造函数只是一个好习惯,比如初始化变量。有人可以帮助我理解复制构造函数的概念。任何帮助将不胜感激。谢谢你。

Tar*_*ran 5

让我们看下一个例子

#include <iostream>
struct A {
    explicit A(int value) : data_(new int[1]) { data_[0] = value; }
    ~A() { delete [] data_; }

    int getValue() const { return data_[0]; }

  private:
    int *data_ = nullptr;
};

int main() {
    A a1(1);
    A a2(2);
    a2 = a1;
    std::cout << a2.getValue() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果执行它,程序就会崩溃。

这里发生的情况是,您正在将int *data_字段从a1复制到a2,然后分配的内存a2被泄漏。

现在a1a2相同的指针。他们都会调用析构函数来释放内存。内存将被释放两次,这会导致崩溃。

提供正确的复制构造函数将解决这个问题。


Ete*_*nal 5

因为不使用复制构造函数,我们也可以获得所需的输出

这实际上不是真的。您没有编写复制构造函数,但是您通过复制构造函数获得了所需的输出,编译器为您编写了该构造函数:

如果没有为类类型(结构、类或联合)提供用户定义的复制构造函数,编译器将始终将复制构造函数声明为其类的非显式内联公共成员

有关隐式声明的复制构造函数的更多详细信息,请参阅https://en.cppreference.com/w/cpp/language/copy_constructor


简而言之,复制构造函数是在复制类的实例时调用的函数。编译器为您编写它,但如果您希望它做一些重要的事情(例如,不是复制指针而是复制它指向的对象),您可以自己编写它