2012-12-17 34 views
2

據我所知,如果你自己沒有聲明任何構造函數,你會得到一個隱式的默認構造函數。作爲一個求職面試問題,我被要求提供一種情況,即你沒有聲明構造函數,但仍然沒有得到隱式的默認構造函數。所以你最終得到一個沒有任何構造函數的類。它應該是編譯的代碼,所以答案是沒有一個本身不提供默認構造函數的成員變量。有任何想法嗎?通過堆棧溢出和各種C++網站搜索沒有發現任何東西。此外,面試官暗示,這並不意味着繼承。沒有構造函數的類(隱式或顯式)

+0

關閉我的頭頂...使它靜態?我不確定。 – MikeTheLiar

+0

AFAIK,你不能聲明一個類在C++中是靜態的。 – chris

+0

@chris完全有可能是這樣的,我在很長一段時間內沒有做過任何C++開發。 – MikeTheLiar

回答

3

如果我對標準的閱讀是正確的,如果沒有使用默認的構造函數,它將不會被隱式定義。

C++ 11 12.1.6:

被默認和定義爲刪除不德網絡連接隱含當ODR使用的定義德音響一個默認的構造(3.2)來創建它的類類型的對象( 1.8)或者在第一次申報後明確違約時。

此外,一個默認的構造可以被定義爲 「已刪除」,C++ 11 12.1.5:

類X A 缺省默認的構造是德音響定義爲刪除,如果:

  • X是聯合狀類,它具有與非平凡缺省構造的變型構件,
  • 沒有大括號或相等的初始值設定任何非靜態數據成員是參考的類型,
  • 任何非常量限定類型(或其數組)的非變量非靜態數據成員,不帶大括號等於初始值設定項沒有用戶提供的默認構造函數,X是聯合體及其全部變體成員是常量-合格音響ED型(或其陣列)的,
  • X是不癒合類和任何匿名聯合成員的所有成員都是常量-合格音響ED型 (或其陣列),或者
  • 任何直接或虛擬基類或非靜態數據成員(不帶括號或等於初始值設定項)具有類型M(或其數組)的類 ,並且M沒有應用的默認構造函數或重載分辨率(13.3) 到M的默認構造函數會導致模糊或在從默認構造函數 中刪除或無法訪問的函數中。

例如,它會從上面看來,下面的程序是合式:

struct X { 
    X(int) {} 
}; 

struct Y { 
    X x; 
}; 

這裏Y沒有一個隱含定義的默認構造函數,因爲它是既沒有使用和定義已刪除。

+0

有趣的引用。如果我們能夠創建對象,那麼它確實隱藏了所有的「它必須有一個對象」。 – chris

0

不,不存在這樣的伎倆,除非它是問題確切措辭的一個表現。

12。1P5:

如果沒有爲X類無用戶聲明的構造函數,無參數的構造函數被隱式欠繳聲明。

隱式聲明的默認構造函數可能被定義爲刪除,但它仍然是該類的成員。

+0

我希望標準是用更易讀的語言編寫的。我們以某種方式通過閱讀相同的文本得出相反的結論,我不知道誰是對的。 :-( – NPE

+0

@NPE:構造函數可以通過重載解析來選擇,而不用被odr使用,例如通過'decltype'。但我同意隱式聲明的默認構造函數不一定是隱式定義的。 – aschepler

0

有效C++,第5項:「這些功能[構造函數,析構函數,複製構造函數,複製賦值運算符]只(如果需要)產生[...]」

據,如果你有一個沒有聲明ctors的類,並且不創建該類的任何實例,那麼您的類將根本沒有構造函數。

相關問題