为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?...
看到《C++ Primer》中的一句話,才想起分析一下這個問題:“static 數據成員的類型可以是該成員所屬的類類型。非 static 成員被限定聲明為其自身類對象的指針或引用”
這兩個問題的關鍵點在于static是屬于類而不屬于任何一個對象,這點一眼可以看出。深究細節的時候發現譚浩強版《C++ 程序設計》296頁中的一段話可以輔助理解這個問題:
“如果只聲明了類而未定義對象,則類的一般數據成員是不占內存空間的,只有在定義對象時,才為對象的數據成員分配空間。但是靜態數據成員不屬于某一個對象,在為對象分配的空間中不包括靜態數據成員所占的空間。靜態數據成員是在所有對象之外單獨開辟空間。只要在類中定義了靜態數據成員,即使不定義對象,也為靜態數據成員分配空間,他可以被引用。”
根據這段說明,假設聲明一個類:
1 class Bar { 2 private: 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的地址”,不過這句話只是點到為止,并沒做更深的探討。
2013-06-05
附錄:
struct和從class的長度計算規則:
①在默認情況下,VC規定各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。②各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節VC會自動填充。③同時VC為了確保結構的大小為結構的字節邊界數(即該結構中占用最大空間的類型所占用的字節數)的倍數,所以在為最后一個成員變量申請空間后,還會根據需要自動填充空缺的字節。
附錄內容摘自:“goodfunman的博客”的《sizeof(struct var) 的長度如何計算》
?
轉載于:https://www.cnblogs.com/tingshuixuan2012/archive/2013/05/03/3055743.html
總結
以上是生活随笔為你收集整理的为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页设计的12种颜色
- 下一篇: Oracle数据库的认证方法、用户管理、