日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么static成员的类型可以是类本身?又为什么非static成员被限定声明为其自身类对象的指针或引用?...

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么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成员被限定声明为其自身类对象的指针或引用?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。