2013-09-21 96 views
15
class A 
{ 
public: 
    A() = default; 
    A(const A&) = delete; 
}; 

class A 
{ 
public: 
    A() = default; 

private: 
    A(const A&) = delete; 
}; 

這兩個定義在任何情況下總是相同嗎?必須刪除一個構造函數是否是私有的?

+9

我公開我的刪除功能,因爲它是**向公衆用戶發佈的公告,它不能默認構建(在你的情況下)。 – Nawaz

回答

26

它們不同只有生成的診斷。如果你把它private,額外的和多餘的訪問違例報告:

class A 
{ 
public: 
    A() = default; 
private: 
    A(const A&) = delete; 
}; 

int main() 
{ 
    A a; 
    A a2=a; 
} 

結果如下額外輸出從GCC 4.8:

main.cpp: In function 'int main()': 
main.cpp:6:5: error: 'A::A(const A&)' is private 
    A(const A&) = delete; 
    ^
main.cpp:12:10: error: within this context 
    A a2=a; 
     ^

因此,我的建議總是刪除方法public

+5

+1。我公開我的已刪除函數,因爲它是向公衆用戶發佈的公告**,它不能被默認構建(在OP的情況下)。 – Nawaz

+3

@Nawaz對,因此它也可以被認爲是類的接口/文檔的一部分。 –

2

我想擴展Daniel Frey's answer。而不是刪除方法總是public,我寧願給這些方法訪問修飾符你會(假設)給這些方法,如果他們不會被刪除。 (我不喜歡總是的情況下,程序員有一個選項,如果它確實會在石頭上,使刪除方法public,它應該由語言本身來執行雕刻。)

的拇指/準則某些規則:

  • 複製和移動賦值運算符將在具象與抽象類public在大多數情況下
  • 複製和移動構造函數將爲public在具體類大多數情況下
  • 對於大多數情況下複製和移動構造函數將在protected抽象類
  • 複製和移動構造將是一個只能通過friends在大多數情況下被實例化具體finalprivate

在任何情況下,您都會向類的相應用戶發佈通告,而不是某個類的所有用戶。

相關問題