在深拷贝构造函数中,最后一行是如何实现的?

编程语言 2026-07-07

下面看到的代码取自 https://www.iditect.com/guide/cplusplus/cpp-deep-shallow-copy.html。我的困惑源自这一行。

     *data = source.data;

现在,在这17篇文章中的一些里,我看到了

     data = new int(*source.data).

不过,在其他一些文章中,我看到的是

     *data = new int(*source.data);

显然,第一种写法是int pointer = RHS(动态内存),而第二种写法是对解引用后的int指针进行赋值,即 *pointer = RHS(动态内存)。它们不可能都对。那么,哪一个才是正确的?我怀疑第二种才是正确的,因为你是在把旧对象的数据转移到新对象的数据中。请帮我澄清一下。

#include <iostream>

class DeepCopy {
public:
    int *data;

    DeepCopy(int value) {
        data = new int;
        *data = value;
    }

    // Deep copy constructor
    DeepCopy(const DeepCopy& source) {
        data = new int;
        *data = *source.data;
    }

    ~DeepCopy() {
        delete data;
    }
};

int main() {
    DeepCopy obj1(10);
    DeepCopy obj2(obj1); // Deep copy

    std::cout << "Object 1 value: " << *obj1.data << std::endl;
    std::cout << "Object 2 value: " << *obj2.data << std::endl;

    // Modify obj2
    *obj2.data = 20;

    std::cout << "After modifying obj2" << std::endl;
    std::cout << "Object 1 value: " << *obj1.data << std::endl;
    std::cout << "Object 2 value: " << *obj2.data << std::endl;

    return 0;
}

解决方案

data = new int;
*data = *source.data;

这会分配一个未初始化的int,然后对其写入值。这没问题。

data = new int(*source.data);

这会分配一个int,并将其初始化为所需的值。这样做更好。

DeepCopy(const DeepCopy& source) : data(new int(*source.data)) {}

这与第二种做法相同,只是在初始化列表中完成。这对构造函数来说是最佳选择。

*data = new int(*source.data);

这不应该编译通过。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章