簡體   English   中英

為什么我要將復制構造函數和賦值運算符設為私有並在C ++中實現?

[英]Why would I make copy constructor and assignment operator private and implemented in C++?

靈感來自這個問題

通常,使復制構造函數和賦值運算符private使類不可復制,以便只能創建和銷毀對象,而不能復制 - 大多數情況下,因為復制它們沒有意義。 在這種情況下,復制構造函數和賦值運算符都是private 而不是實現的 - 如果類不可復制,那么沒有人應該復制。

復制構造函數和賦值運算符是否需要是private並且同時具有有意義的實現?

我的猜測是,這對於持有自己列表的類很有用 - 然后它可以在內部復制實例。 這實際上只對作為項和容器的類有用:

class MyItems
{
private:
    /* Copy ctor and =operator */
    List list;
public:
    void AddItems(MyItems* items)
    {
        MyItems* added = new MyItems(items);
        list.Add(added);
    }
};

另一個想法是允許在班級控制的情況下進行克隆。 當復制有意義時,這可能很有用,但僅限於特定條件或權限:

class MyClass
{
private:
    /* Copy ctor and =operator */
public:
    MyClass* clone()
    {
        if (canClone)
        {
            MyClass* cloned = new MyClass(this);
            return cloned;
        }
        else
        {
            return NULL;
        }
    }
};

有兩種情況立即浮現在腦海中:

  1. friend

    比方說,作為你設計的一部分,你有兩個高度耦合的類,其中一個需要能夠復制另一個(比如,在工廠模型或其他類似),但你不想讓整個世界成為能夠復制它。

  2. 包裝:

    假設您希望能夠有條件地克隆某些元素,具體取決於某些內部行為(例如,取決於某些類狀態條件) - 從語言角度來看,最簡潔的方法仍然是將復制分離為自己的函數。 這樣可以很好地分離關注點。

  1. 我們使復制構造函數和operator =未實現,以便即使是friend也無法訪問它。 如果您實施,則意味着您希望friend有權訪問。 這是一個設計決定。
  2. 你想做明確的克隆 ; 即允許復制,但也使其代碼“臟”看起來(類似於C ++樣式的轉換操作, 在代碼中顯示污垢

例如

class A {
  A(const A& obj) { ... }
  A& operator = (const A& obj) { ... }
public:
  A& clone(const A& obj)
  {
    *this = obj;
    return *this;
  }
};

我們已經使用這個包裝器clone()來允許用戶進行克隆,但是它也明確地顯示了他/她正在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM