受this question的啓發。爲什麼我會使複製構造函數和賦值運算符爲私有並在C++中實現?
通常使拷貝構造函數和賦值操作符private
的原因是爲了make the class non-copyable,這樣才能創建的對象和銷燬,但不會複製 - 大多數時候是因爲它們複製將毫無意義。在這種情況下,複製構造函數和賦值運算符都是private
並且未實現 - 如果類不可複製,則無人複製。
是否有複製構造函數和賦值運算符需要爲private
並且同時具有有意義的實現的情況?
受this question的啓發。爲什麼我會使複製構造函數和賦值運算符爲私有並在C++中實現?
通常使拷貝構造函數和賦值操作符private
的原因是爲了make the class non-copyable,這樣才能創建的對象和銷燬,但不會複製 - 大多數時候是因爲它們複製將毫無意義。在這種情況下,複製構造函數和賦值運算符都是private
並且未實現 - 如果類不可複製,則無人複製。
是否有複製構造函數和賦值運算符需要爲private
並且同時具有有意義的實現的情況?
有兩種情況立即浮現在腦海:
friend
S:
說作爲你設計的一部分,你有兩個高度耦合的類,其中一個需要能夠複製另一個(比如工廠模型或其他類型),但你不想讓整個世界都能夠複製它。
包裝:
說你希望能夠有條件地克隆了一些元素,根據一些內部行爲(例如,根據某些類有狀態條件) - 最徹底的方法,從語言的角度 - 是仍然要將複製分成它自己的功能。這樣可以很好地區分顧慮。
+1,我們的答案非常相似。 :) – iammilind
我的猜測是,這對於持有自身列表的類非常有用 - 那麼它可以在內部複製實例。這確實是唯一有用的一類,它是兩個項目和容器:
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;
}
}
};
爲什麼你想禁止客戶在第一個例子中製作副本? –
@Martinho:'List'對象可能不會擁有'List :: add'的所有權。因此,在第一個例子中保持客戶端不會創建副本,不必擔心誰在'list'成員中擁有'MyItem'實例。 –
operator =
未實現這樣即使 一個friend
不能有任何訪問。如果實施,則意味着您要friend
有權訪問 。這是一個設計決定。例如
class A {
A(const A& obj) { ... }
A& operator = (const A& obj) { ... }
public:
A& clone(const A& obj)
{
*this = obj;
return *this;
}
};
我們已經把這個包裝clone()
允許克隆用戶,但它也顯示明確究竟是什麼,他/她在做什麼。
在C++中讀取0x的被刪除的函數,這是通過使用'= delete'而不是跳過箍環的這種類型的語法糖。 – rubenvb
這不是另一個問題的謎團嗎?另一個沒有指定*僅*具有實現的私有構造函數,但至少有一個答案(http://stackoverflow.com/questions/6811037/whats-the-use-of-the-private-copy-constructor-in- c/6811507#6811507)涉及這一點。 –
@Steve Jessop:問題是讓他們私密的頭號原因是爲了防止完全複製,然後他們沒有實現,這就是大多數人(我也一樣)在被問及這個問題時想到的。由於我對「私人+實施」場景特別感興趣,因此我不得不提出這個問題並強調具體的重點。 – sharptooth