乙個空的class在c++編譯器處理過後就不再為空,編譯器會自動地為我們宣告一些member function,如果你寫
class empty{};
就相當於:
class empty
;
這是網上流傳的答案,而且在侯捷翻譯的中文簡體《effective c++, 2nd》有介紹:
條款45: 弄清c++在幕後為你所寫、所呼叫的函式
乙個空類什麼時候不是空類?當c++編譯器通過它的時候。如果你沒有宣告下列函式,體貼的編譯器會宣告它自己的版本。這些函式是:乙個拷貝建構函式,乙個賦值運算子,乙個析構函式,一對取址運算子。另外,如果你沒有宣告任何建構函式,它也將為你宣告乙個預設建構函式。所有這些函式都是公有的。換句話說,如果你這麼寫:
class empty{};
和你這麼寫是一樣的:
class empty
;
對於這個問題,好像早有讀者向書的作者scott meyers提出了疑問,scott meyers也認為上邊的答案是有問題的.正確的結果應該是:
class empty
另外,需要注意的是只有當你需要用到這些函式的時候,編譯器才會去定義它們。
宣告乙個空類,大家都認為會生成建構函式、拷貝建構函式、析構函式、賦值運算符號;其實對於這樣的乙個空類來說,是完全沒有必要的,而編譯器也不是這樣做的。是我們太低估編譯器給我們做的工作了,我們用vc編譯器來說明一下。
class a;
對於單獨申明的乙個空類a來說,編譯器編譯過程中,並沒有發現建立a例項。所以對於空類a來說,編譯器是不會給類a生成任何函式的;如果我們在**中需要生成乙個a的例項,比如
a a;
編譯器就會根據上面的例項,給類a生成建構函式和析構函式。 當使用
a b(b);
編譯器就會生成類a的拷貝建構函式;
a c;
c = a;
編譯器生成賦值運算子函式;
a &d = a;
編譯器生成取位址運算子函式。
經過分析可以這樣理解:對於乙個沒有例項化的空類,編譯器是不會給它生成任何函式的,當例項化乙個空類後,編譯器會根據需要生成相應的函式。這條理論同樣適合非空類(只宣告變數,而不宣告函式)。
最後,預設的析構函式應該不是虛函式,因為許多類不是被用來做基類的,而虛函式只有位於基類時才有意義。
C 編譯器會為你的類新增那些成員函式
乙個空的c 類,編譯器會給你做什麼?如果你沒有如下函式,體貼的編譯器會為你宣告它自己的版本 乙個預設的建構函式,乙個拷貝建構函式,乙個析構函式,乙個賦值運算子,一對取址運算子.例 class empty 等價於 class empty 我們 中是怎麼用的 const empty e1 預設建構函式 ...
C 中的空類,編譯器預設可以產生哪些成員函式
c 中建立乙個空類 class empty 缺省會生成4個函式,其函式的原型如下 public empty empty const empty rhs empty empty operator const empty rhs 說明 1 這些函式只有在需要呼叫的時候,編譯器才會生成。2 4個函式都是p...
編譯器預設實現的類成員函式
以下幾種情況編譯會生成類成員函式情況如下 include include include 編譯器為我們實現了幾個類成員函式?class empty empty e empty b e empty d empty b d empty f b empty operator 取址運算子 const emp...