據我所知,如果你自己沒有聲明任何構造函數,你會得到一個隱式的默認構造函數。作爲一個求職面試問題,我被要求提供一種情況,即你沒有聲明構造函數,但仍然沒有得到隱式的默認構造函數。所以你最終得到一個沒有任何構造函數的類。它應該是編譯的代碼,所以答案是沒有一個本身不提供默認構造函數的成員變量。有任何想法嗎?通過堆棧溢出和各種C++網站搜索沒有發現任何東西。此外,面試官暗示,這並不意味着繼承。沒有構造函數的類(隱式或顯式)
2
A
回答
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
0
有效C++,第5項:「這些功能[構造函數,析構函數,複製構造函數,複製賦值運算符]只(如果需要)產生[...]」
據,如果你有一個沒有聲明ctors的類,並且不創建該類的任何實例,那麼您的類將根本沒有構造函數。
相關問題
- 1. 顯式隱式構造函數
- 2. 沒有顯式構造函數和只讀屬性的C#類
- 3. 繼承的構造函數和「顯式比隱式更好」
- 4. 沒有參數的構造函數或參數構造函數
- 5. 隱式構造函數與「空」構造函數
- 6. C++顯式通用引用構造函數不隱藏複製構造函數?
- 7. C++ 11:默認構造函數:隱式還是顯式?
- 8. 通過子類構造函數隱式調用默認構造函數
- 9. 構造函數或顯式類型轉換
- 10. 隱式調用父構造函數
- 11. C++構造函數隱式成員
- 12. 隱式構造函數不被識別
- 13. C++模板:隱式轉換,沒有匹配的函數調用構造函數
- 14. 在Coq中有( - >)的顯式類型構造函數嗎?
- 15. 如何在父類沒有默認構造函數時定義顯式構造函數?
- 16. 結構隱式默認構造函數與無參數構造函數
- 17. 使用Lombok的顯式構造函數?
- 18. 顯式構造函數和的static_cast
- 19. 構造函數類的括號內的隱式生成器?
- 20. 錯誤:候選構造函數(隱式轉移構造函數)並不可行:沒有已知的轉換
- 21. 用隱式參數重載case類構造函數?
- 22. Java。隱式超級構造函數Employee()未定義。必須顯式調用另一個構造函數
- 23. F中沒有構造函數的類#
- 24. 沒有構造函數的Java類?
- 25. 沒有構造函數的C#類
- 26. 爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
- 27. Java錯誤:隱式超級構造函數沒有定義默認構造函數
- 28. 顯式強制構造函數?
- 29. 繼承和顯式構造函數?
- 30. 顯式調用靜態構造函數
關閉我的頭頂...使它靜態?我不確定。 – MikeTheLiar
AFAIK,你不能聲明一個類在C++中是靜態的。 – chris
@chris完全有可能是這樣的,我在很長一段時間內沒有做過任何C++開發。 – MikeTheLiar