2015-10-01 25 views
2

我們假設我有沒有顯式拷貝構造函數的類。是否有可能禁止分配或複製這個類的對象的操作?例如:如果沒有顯式拷貝構造函數,是否可以禁止賦值? C++

class A 
{ 
    // data, methods, but no copy constructor and no overloaded assignment operator 
}; 

A object1; 
A object2; 

object1 = object2; // make compiler error here 

A object3 = object1; // or here 
+0

你是什麼意思「沒有顯式拷貝構造函數的類」?你的意思是這個類不是可複製的,或者你沒有定義一個拷貝構造函數? – juanchopanza

+0

我沒有定義一個。 – Avert

回答

9

爲刪除您可能標誌着拷貝構造函數和拷貝賦值運算符:

class A 
{ 
public: 
    ... 

    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
}; 

如果你的編譯器不支持這樣的C++ 11點的特性,才使功能private

1

假設我有類沒有明確的拷貝構造函數。是否有可能禁止分配或複製這個類的對象的操作?

boost::noncopyable派生它,這是一個不可複製的基類,或者添加一個不可複製的非靜態數據成員。

1

如果你沒有顯式拷貝構造函數。編譯器會爲你創建一個默認的。

  • 禁止複製使複製構造函數爲私有。
  • 禁止轉讓化妝賦值運算符私人
0

我也可以聲明拷貝構造函數或賦值操作符不清晰。當我打電話給他們其中一人時,我得到鏈接器錯誤。

+0

OP正在詢問編譯器錯誤。 – juanchopanza

2

試試這個

private: 

     A(A const&); //Don't implement it 
     A& operator=(A const&);//Don't implement it 

或C++ 11

 A(A const&)    = delete; 
     A& operator=(A const&) = delete; 
0

隱含的拷貝構造函數和賦值運算符只能被稱爲如果編譯器生成它們。他們(概念上至少)複製基類,然後執行所有成員的成員副本。如果其中任何一個操作都無法執行,則不會生成隱式拷貝構造函數或賦值運算符。

因此,您可以通過派生自不可複製的基類或通過包含非可複製類型的(非靜態)成員來禁止這些操作。作爲一種編碼原則,我認爲將操作顯式聲明爲已刪除(或私有,C++之前的成員)成員,而不是依賴不可複製成員或基類的存在會更清楚。如果成員/基地的名稱是爲了表達該意圖,我會例外(例如boost::noncopyable)。

0

你的問題有兩個部分:

首先是顯式構造,顯式構造的目的是爲了避免隱式建築。隱式建築我的意思是

struct C { 
    int a; 
    C(int p):a(p) {} 
    ~C(){std::cout<<"Destructor for "<<a<<'\n';} 
}; 
int main() { 
    C c1 = 142; // implicit-initialization, calls C::C(42) 
    C c2{12}; // 

    return 0; 
} 

但是,如果我們使構造明確爲

explicit C(int a); 

然後下面的代碼將無法編譯。

C c1 = 142; // would not compile 

這是關於顯式構造函數。

第二部分是避免複製和分配。所以,你有兩個選擇

  1. 如建議被他人使用boost ::不可複製

  2. 記住「三/五類/零規則」 http://en.cppreference.com/w/cpp/language/rule_of_three,讓你的 拷貝構造函數,將ctor &賦值運算符刪除。

相關問題