首頁  >  文章  >  後端開發  >  深複製與淺複製:何時需要資料的真實副本?

深複製與淺複製:何時需要資料的真實副本?

Barbara Streisand
Barbara Streisand原創
2024-10-27 11:01:30833瀏覽

 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