C 編譯器會為類新增哪些成員函式

2021-06-12 20:05:45 字數 1358 閱讀 3727

乙個空的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...