C 空類編譯器自動生成的6個成員函式

2021-07-16 05:24:24 字數 2500 閱讀 7914

在c++中,編譯器會為空類提供哪些預設成員函式?分別有什麼樣的功能呢? 

對於空類,編譯器不會生成任何的成員函式,只會生成1個位元組的佔位符。

有時可能會以為編譯器會為空類生成預設建構函式等,事實上是不會的,編譯器只會在需要的時候生成6個成員函式:乙個預設的建構函式、乙個拷貝建構函式、乙個析構函式、乙個賦值運算子、一對取址運算子和乙個this指標。

**:[html]view plain

copy

#include 

<

iostream

>

using namespace std;  

class empty_one  

;  class empty_two  

{};  

class empty_three  

;  class empty_four :  public empty_two, public empty_three  

;  int main()    

執行結果:

分析:類empty_one、empty_two是空類,但空類同樣可以被例項化,而每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址,所以sizeof(empty_one)和sizeof(empty_two)的大小為1。

類empty_three裡面因有乙個純虛函式,故有乙個指向虛函式的指標(vptr),64位系統分配給指標的大小為8個位元組,所以sizeof(empty_three

)的大小為8。

類empty_four繼承於empty_two和empty_three,編譯器取消empty_two

的佔位符,保留一虛函式

表,故大小為8。

當空類empty_one定義乙個物件時empty_one pt;sizeof(pt)仍是為1,但編譯器會生成6個成員函式:乙個預設的建構函式、乙個拷貝建構函式、乙個析構函式、乙個賦值運算子、兩個取址運算子。

[html]view plain

copy

class empty  

{};  

等價於:

[html]view plain

copy

class empty  

;  

使用時的呼叫情況:

[html]view plain

copy

empty *e= 

newempty();    //預設建構函式  

delete e;                  //析構函式  

empty e1;                  //預設建構函式                                 

empty e2(e1);              //拷貝建構函式  

e2= 

e1;                   //賦值運算子  

empty *pe1

= &e1;          //取址運算子(非const)  

const empty *pe2

= &e2;    //取址運算子(const)  

c++編譯器對這些函式的實現:

[html]view plain

copy

inline empty::empty()                          //預設建構函式  

inline empty::~empty()                         //析構函式  

inline empty *empty::operator&()               //取址運算子(非const)  

inline const empty *empty::operator&() const    //取址運算子(const)  

inline empty::empty(const empty &rhs)           //拷貝建構函式  

inline empty& empty::operator

=(const empty &rhs) //賦值運算子    

例如:m是類c中的乙個型別為t的非靜態成員變數,若c沒有宣告拷貝建構函式(賦值運算子), m將會通過t的拷貝建構函式(賦值運算子)被拷貝構造(賦值);該規則遞迴應用到m的資料成員,直到找到乙個拷貝建構函式(賦值運算子)或固定型別(例如:int、double、指標等)為止。

(1)上述執行結果依賴於編譯器和64位、32位不同的系統。

(2)本博文只是總結一些c++特性,也有無法理解的地方,不足之處還請指出,在此先感謝!

個人理解:好像挺有道理的,efficient c++裡面貌似看到過,不過好像深入理解物件模型裡面講得更加複雜。

C 編譯器為類自動生成的函式

我們可以構建乙個空類,class empty 儘管沒有定義任何函式,但我們可以通過以下方式使用這個類 empty e1 empty e2 e1 e2 e1 因為當編譯器發現你用上述方式使用這個類而卻在類宣告中沒有定義一般建構函式 非複製建構函式 複製建構函式 賦值操作符過載函式和析構函式時,會自動為...

C 類編譯器自動生成函式的實現

在c 中,乙個類有八個預設函式 預設建構函式 預設拷貝建構函式 預設析構函式 預設過載賦值運算子函式 預設過載取址運算子函式 預設過載取址運算子const函式 預設移動建構函式 c 11 預設過載移動賦值操作符函式 c 11 class myclass c 預設建構函式是對類中的引數提供預設值的建構...

C 中的空類,編譯器預設可以產生哪些成員函式

c 中建立乙個空類 class empty 缺省會生成4個函式,其函式的原型如下 public empty empty const empty rhs empty empty operator const empty rhs 說明 1 這些函式只有在需要呼叫的時候,編譯器才會生成。2 4個函式都是p...