首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ struct 與 union 深度解析:內存佈局、訪問權限與高級特性

     編輯:關於C++

struct:不只是 C 的結構體

C++ 對 struct 進行了重大擴充:

  1. 真正的類型:定義變量時無需 struct 關鍵字,也無需 typedef。
  2. 可定義成員函數:包括構造函數、析構函數等,支援訪問權限(public/private/protected)。
  3. 默認訪問權限為 public:這是 struct 與 class 的唯一區別(class 默認 private),為保持 C 兼容性而設計。
  4. 初始化規則:無顯式構造函數時可用花括號順序初始化(如 Room r[3] = {{1,101},{2,201},{3,301}});一旦定義任意構造函數,花括號初始化即失效。
  5. 內存對齊:sizeof 需考慮成員對齊導致的填充字節。

union:節省空間的特殊類

聯合體成員共享同一塊內存,大小由最大成員決定。修改任一成員會影響所有其他成員。

基本性質演示

union TestUnion { char c; int i; };
// sizeof(TestUnion) == 4 (由 int 決定)
TestUnion u; u.c = 'A'; // 此時 u.i 的低位字節變為 0x41,高位保持原值

高級特性與限制

  • 可指定訪問權限(默認 public),可定義成員函數(含構造/析構)。
  • 不能作為基類被繼承。
  • 不能有靜態數據成員或引用成員(靜態不共享內存,引用不可修改違背聯合體語義)。
  • 成員類若含構造/析構/虛函數等則不能作為聯合體成員(破壞內存共享語義)。
  • 匿名聯合體:直接聲明不帶名稱的 union,其成員與外層作用域同級,不允許成員函數、私有/保護成員、全局非靜態成員。

匿名聯合體示例

union { char a; int b; }; // 匿名聯合體
a = 'X'; // 直接訪問,等價於修改 b 的低位字節

總結

struct 是「默認 public 的 class」,union 是「共享內存的特殊類」,兩者均支援面向對象特性,但語義與限制截然不同。善用 struct 封裝純數據聚合,用 union 實現類型雙關或節省內存。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved