1.c++空類及沒有成員變數的類的大小例項分析
眾所周知的c++中空類的大小為1,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有相當一部分開發人員對此有很多不明之處的。
這裡我們以如下**為例:
#include using namespace std;
class a {};
class b
};class c :public a ;
class d :public b, public c {};
int main()
為什麼會出現這種結果呢?初學者肯定會對此疑惑不解,類a,b明明是空類,它的大小應該為為0,為什麼編譯器輸出的結果為1呢?這就是我們剛才所說的例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址,所以a,b的大小為1。
而類c是由類a派生而來,它裡面有乙個純虛函式,由於有虛函式的原因,有乙個指向虛函式表的指標(vptr,有多個虛函式仍然是只有乙個指標),在32位的系統分配給指標的大小為4個位元組,所以最後得到c類的大小為4。
類d的大小更是會讓很多的初學者疑惑,類d是由類b,c派生而來的,它的大小應該為二者之和5,為什麼卻是8呢?這是因為為了提高例項在記憶體中的訪問效率,記憶體中會有資料對齊,於是類的大小往往被調整到4位元組的整數倍。並採取就近的法則,往大的方向取最近的倍數,就是該類的大小,所以類d的大小為8個位元組(假如d由3個空類和c派生而來,仍然是8)。
空類的作用
class empty
//允許子類呼叫
~empty(){}
private:
empty(const empty&); //禁止複製
empty& operator = (const empty&);//禁止賦值
};class someclass: private empty
;
由以上示例可以看出,如果我們有些類不想被複製或賦值,可以通過從empty繼承來實現。
2.在c++中,編譯器會為空類提供哪些預設成員函式?分別有什麼樣的功能呢?
空類,宣告時編譯器不會生成任何成員函式,只會生成1個位元組的佔位符。
有時可能會以為編譯器會為空類生成預設建構函式等,事實上是不會的,編譯器只會在需要的時候(當空類定義乙個物件)生成6個成員函式:乙個預設的建構函式、乙個拷貝建構函式、乙個析構函式、乙個賦值運算子、一對取址運算子和乙個this指標。
當空類定義乙個物件時sizeof(empty)仍是為1,但編譯器會生成6個成員函式:乙個預設的建構函式、乙個拷貝建構函式、乙個析構函式、乙個賦值運算子、兩個取址運算子。
class empty {};
等價於
class empty
;
使用時的呼叫情況:
empty *e = new empty(); //預設建構函式
delete e; //析構函式
empty e1; //預設建構函式
empty e2(e1); //拷貝建構函式
e2 = e1; //賦值運算子
empty *pe1 = &e1; //取址運算子(非const)
const empty *pe2 = &e2; //取址運算子(const)
c++編譯器對這些函式的實現:
inline empty::empty() //預設建構函式
inline empty::~empty() //析構函式
inline empty *empty::operator&() //取址運算子(非const)
inline const empty *empty::operator&() const //取址運算子(const)
inline empty::empty(const empty&) //拷貝建構函式
inline empty& empty::operator=(const empty&) //賦值運算子
例如:m是類c中的乙個型別為t的非靜態成員變數,若c沒有宣告拷貝建構函式(賦值運算子), m將會通過t的拷貝建構函式(賦值運算子)被拷貝構造(賦值);該規則遞迴應用到m的資料成員,直到找到乙個拷貝建構函式(賦值運算子)或固定型別(例如:int、double、指標等)為止。
c 空類的大小
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...
c 空類的大小
定義乙個空類,沒有資料 class empty class test2 private empty private繼承 class test3 public empty public繼承 int tmain int argc,tchar argv cout class test1 class tes...
筆記 C 的空類
面試題 新建乙個c 的空類,會產生那些函式。class empty 編譯器處理後 生成如下 class empty 每次遇到這個問題,我都會思考 為什麼c 編譯器會自動生成這幾個函式而不生成其他函式呢?所有上述函式都會同時產生嗎?還是說編譯器檢測到使用到某函式時,才會定義他們呢?他們有什麼作用?什麼...