首页 >后端开发 >C++ >深复制与浅复制:何时需要数据的真实副本?

深复制与浅复制:何时需要数据的真实副本?

Barbara Streisand
Barbara Streisand原创
2024-10-27 11:01:30911浏览

 Deep Copy vs. Shallow Copy: When Do I Need a True Copy of My Data?

深拷贝与浅拷贝

问题:

两者之间的主要区别是什么深拷贝和浅拷贝?

答案:

浅拷贝:

  • 复制对象的值但保留对共享对象的引用。
  • 示例:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(copy.pi) {}
    };</code>

    在此浅复制中, pi 在原始对象和复制对象中引用相同的 int 对象。

深度复制:

  • 创建原始对象的完整副本,包括所有嵌入对象。
  • 示例:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {}
    };</code>

    在此深度复制中,pi 指向一个新的 int 对象,其值与原始对象相同。

复制构造函数类型:

默认的复制构造函数取决于每个成员的复制构造函数的行为:

  • 对于标量类型,使用默认的赋值运算符,从而产生浅复制。
  • 但是,严格来说默认的复制构造函数总是执行浅复制并不正确。它可以实现深复制,甚至深浅复制的组合,具体取决于成员类型的复制行为。

示例:

In在下面的示例中,默认的复制构造函数由于其实现而为 std::vector 成员创建了一个深层副本:

<code class="c++">class Y {
private:
    std::vector<int> v;
public:
    Y() {}
    Y(const Y& copy) : v(copy.v) {}
};</code>

在这种情况下,std::vector 的复制构造函数为其创建了一个深层副本内容。

以上是深复制与浅复制:何时需要数据的真实副本?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn