1. 程式人生 > >為什麼static成員的型別可以是類本身?又為什麼非static成員被限定宣告為其自身類物件的指標或引用?

為什麼static成員的型別可以是類本身?又為什麼非static成員被限定宣告為其自身類物件的指標或引用?

提出這兩個問題,源於《C++ Primer》中的一句話:“static 資料成員的型別可以是該成員所屬的類型別。非 static 成員被限定宣告為其自身類物件的指標或引用”

這兩個問題的癥結一眼可以看出,在於static是屬於類而不屬於任何一個物件。但僅拿這句話,想要辨析清楚標題中問題的時候,邏輯可能會亂。下面是譚浩強版《C++ 程式設計》296頁中的一段話,來輔助解析這個問題:

“如果只聲明瞭類而未定義物件,則類的一般資料成員是不佔記憶體空間的,只有在定義物件時,才為物件的資料成員分配空間。但是靜態資料成員不屬於某一個物件,在為物件分配的空間中不包括靜態資料成員所佔的空間。靜態資料成員是在所有物件之外單獨開闢空間。只要在類中定義了靜態資料成員,即使不定義物件,也為靜態資料成員分配空間,他可以被引用。”

根據這段說明,假設宣告一個類:

1class Bar { 
2private
3    int a;
4    int b;    
5    static Bar mem1; // ok 
6       };   

在定義一個Bar物件A的時候,因為mem1不屬於任何物件,所以A所需的空間只需關注a和b的空間和,是一個固定的可計算值。又因mem1本身是用Bar定義的一個物件,自然它佔空間的大小與A相同,只是鑑於static的成員特性,在定義任何物件之前,mem1已經存在於一個單獨開闢的空間。

標題中的第二個問題就不同,假設它的類的形式是這樣的:

class Bar2 {        
private:            
    int c;           
    int d;               
    Bar2 mem2; // error!        
};   

mem2是非static型別成員,那麼使用Bar2在定義物件的時候,首先要知道該型別Bar2需要的空間,也就是說你不知道Bar2的大小,需要計算,於是,你用int+int+Bar2,顯然,這其中有一個未知數,編譯器計算得不到結果,自然報錯。

當“int+int+固定值”的時候,這個問題就得以解決,這時“固定值這個位置”,指標是一個不錯的選擇,因為指標本身佔據4個位元組空間,這點與它指向的物件大小無關。至於為什麼“引用”也可以,那就需要了解一下“引用的本質”,在譚版《

C++ 程式設計》194頁有這麼一句話:“宣告b為a的引用,可以理解為:是變數b具有變數a的地址”,這句話顯然是點到為止,並沒做更深的探討。