step1:寫個空類
class cbluesky{};
注:sizeof(cbluesky) 等於 1
step2:編譯器可能會為cbluesky空類宣告以下函式/操作符:如果預設建構函式,拷貝建構函式,析構函式,賦值操作符,如下所示:
class cbluesky// 預設建構函式
cbluesky(const cbluesky& other) //拷貝建構函式
~cbluesky()//析構函式
cbluesky& operator = (const cbluesky& other) //拷貝賦值操作符
注:這些函式都是pubic且inline函式!
注:sizeof(cbluesky) 等於 1,拋個問題:思考下類的size問題。
step3:上面的「可能會「如何理解?
當這些函式被需要時,在編譯階段會被編譯器宣告建立出來。被需要的示例如下所示:
cbluesky a1;//需要 預設建構函式
//宣告週期結束時,需要 析構函式
cbluesky a2(a1); //需要 拷貝建構函式
a2 = a1; //需要 拷貝賦值操作符
如果這時候你的cbluesky是空類,則編譯器會宣告以上這些函式。
如果這時候你的cblusesky已經實現了這些函式,編譯器只進行編譯操作,不會再宣告這些函式。
step4:如果cbluesky類如果定義了建構函式,編譯器不會再為cbluesky宣告建立任何建構函式。
//< bluesky.h
#ifndef __blueskyjoyn_bluesky_h_
#define __blueskyjoyn_bluesky_h_
namespace blueskyjoyn ;
}#endif
//< bluesky.cpp
#include "bluesky.h"
namespace blueskyjoyn
}int main()
main中的a1需要呼叫無參預設建構函式,但是cbluesky已經有了建構函式(但沒有預設建構函式),編譯器不會再為cbluesky建立無參預設建構函式,而是提示error,編譯失敗。
step5:沒有拷貝賦值操作符,編譯器給你宣告建立,看下例:
上面main換成下面,可以通過編譯
int main()
注:由於沒有呼叫到拷貝建構函式,編譯器不會為你宣告建立copy constructor。
step6:編譯器不會隨意給你建立copy constructor,他也要遵守c++規則。
c++規則,先看乙個,如下所示:
1)引用初始化後不允許 指向其他不同的物件,如:
int i = 1;
int j = 2;
int &ri = i;
ri = j; // wrong!!!!, c++不允許讓ri指向其他int物件
由上可知,如果cbluesky類中有reference成員時,編譯器為了遵守c++的「reference物件 不允許指向其他物件」規則,不會為其生命建立拷貝賦值操作符!
2)如果類中有"內含const 成員,則編譯器也會拒絕為其建立operator=操作符
3)如果base-class的operator=是private,則編譯器拒絕為其derived-class宣告建立operator=操作符
綜上所述:編譯器可以「潤物細無聲」地為乙個類建立預設建構函式,拷貝建構函式,拷貝賦值操作符,析構函式,宣告建立這些函式是在遵守c++規則的前提下。做雷鋒還要遵守規則,嗯。
C 編譯器為類自動生成的函式
我們可以構建乙個空類,class empty 儘管沒有定義任何函式,但我們可以通過以下方式使用這個類 empty e1 empty e2 e1 e2 e1 因為當編譯器發現你用上述方式使用這個類而卻在類宣告中沒有定義一般建構函式 非複製建構函式 複製建構函式 賦值操作符過載函式和析構函式時,會自動為...
C 空類編譯器自動生成的6個成員函式
在c 中,編譯器會為空類提供哪些預設成員函式?分別有什麼樣的功能呢?對於空類,編譯器不會生成任何的成員函式,只會生成1個位元組的佔位符。有時可能會以為編譯器會為空類生成預設建構函式等,事實上是不會的,編譯器只會在需要的時候生成6個成員函式 乙個預設的建構函式 乙個拷貝建構函式 乙個析構函式 乙個賦值...
C 中的空類,編譯器預設可以產生哪些成員函式
c 中建立乙個空類 class empty 缺省會生成4個函式,其函式的原型如下 public empty empty const empty rhs empty empty operator const empty rhs 說明 1 這些函式只有在需要呼叫的時候,編譯器才會生成。2 4個函式都是p...