2010-04-17 48 views
3

假設,我寫編譯器將什麼添加到空的類聲明?

class A { }; 

編譯器應提供(在需要時和)

  1. 構造
  2. 析構函數
  3. 一個拷貝構造
  4. =運算

這是所有編譯器提供的嗎?這個列表是否有增加或刪除?

+1

我來到AC爲了未來訪問者的利益,可能值得一提的是,在C++ 11中,除了上述之外,還自動生成移動構造函數以及移動賦值運算符。 – jogojapan 2013-02-25 13:30:56

回答

6

它是完整的。但是,有兩點應該注意:

  1. 這是副本 =操作。就像複製構造函數一樣,有一個複製賦值運算符。
  2. 它們僅在實際使用時才提供。

一些解釋2:

struct A { private: A(); }; 
struct B : A { }; 

這很好!提供默認的構造函數對於「B」是不合格的,因爲它不能調用基類的構造函數。但是,如果實際需要默認的構造函數(以及其他特殊函數),則僅提供(我們說它是隱式定義的)。

+3

我想你可以爭辯說,在空的類的情況下,編譯器還添加至少一個填充字節;-) – 2010-04-17 23:17:11

1

您的列表已完成。這就是它所添加的。

0

該列表尚未完成............ 除上述提及的四個屬性外,還有一個地址運算符(&)重載方法,它返回調用對象的地址,也由編譯器自動提供。

0

有五個屬性:

構造

拷貝構造函數

析構函數

賦值運算符

引用操作符(&) - 地址