📌  相关文章
📜  我们什么时候应该用 C++ 编写自己的复制构造函数?

📅  最后修改于: 2022-05-13 01:54:56.991000             🧑  作者: Mango

我们什么时候应该用 C++ 编写自己的复制构造函数?

复制构造函数是一个成员函数,它使用同一类的另一个对象来初始化一个对象。 (请参阅本文以供参考)。

我们什么时候应该编写自己的复制构造函数?

C++ 编译器为类提供默认的复制构造函数(和赋值运算符)。当我们不提供复制构造函数(和赋值运算符)的实现并尝试使用同一个类的已初始化对象初始化对象时,复制构造函数被调用并在目标对象中一一复制类的成员。

但是默认复制构造函数(和赋值运算符)的问题是:

  • 当我们有在运行时动态初始化的成员时,默认的复制构造函数会使用动态分配的内存地址复制该成员,而不是该内存的真实副本。
  • 现在,两个对象都指向同一个内存,其中一个对象的变化反映在另一个对象中。
  • 此外,主要的灾难性影响是,当我们删除其中一个对象时,另一个对象仍然指向相同的内存,这将是一个悬空指针,并且内存泄漏也是这种方法的一个可能问题。

因此,仅当对象具有指针或资源的任何运行时分配(如文件句柄、网络连接等)时,我们才需要定义自己的复制构造函数。

默认构造函数只做浅拷贝。

浅拷贝 C++

只有使用用户定义的复制构造函数才能进行深度复制。在用户定义的复制构造函数中,我们确保复制对象的指针(或引用)指向新的内存位置。

深度复制 C++

因此,在这种情况下,我们应该始终编写自己的复制构造函数(和赋值运算符)。