C++ union結構式一種特殊的類。它能夠包含訪問權限、成員變量、成員函數(可以包含構造函數和析構函數)。它不能包含虛函數和靜態數據變量。它也不能被用作其他類的基類,它本身也不能有從某個基類派生而來。Union中得默認訪問權限是public。聯合里不允許存放帶有構造函數、析夠函數、復制拷貝操作符等的類,因為他們共享內存,編譯器無法保證這些對象不被破壞,也無法保證離開時調用析夠函數。
在C/C++程序的編寫中,當多個基本數據類型或復合數據結構要占用同一片內存時,我們要使用聯合體;當多種類型,多個對象,多個事物只取其一時(我們姑且通俗地稱其為“n 選1”),我們也可以使用聯合體來發揮其長處。
這里所謂的共享不是指把多個成員同時裝入一個聯合變量內, 而是指該聯合變量可被賦予任一成員值,但每次只能賦一種值, 賦入新值則沖去舊值。在某一時刻,一個union中只能有一個值是有效的。
union的內存分配
#include <iostream> using namespace std; union Test{ struct{ int x; int y; int z; }s; int k; }myUnion; int main() { myUnion.s.x = 4; myUnion.s.y = 5; myUnion.s.z = 6; myUnion.k = 0; cout<< myUnion.s.x <<endl; cout<< myUnion.s.y <<endl; cout<< myUnion.s.z <<endl; cout<< myUnion.k <<endl; return 0; }
運行結果
解釋
union類型是共享內存的,以size最大的結構作為自己的大小。每個數據成員在內存中得其實地址是相同的。這樣的話,myun這個結構就包含u這個結構體,而大小也等於u這個結構體的大小,在內存中的排列為聲明的順序x,y,z從低到高,然后賦值的時候,在內存中,就是x的位置放置4,y的位置放置5,z的位置放置6,現在對k賦值,對k的賦值因為是union,要共享內存,所以從union的首地址開始放置,首地址開始的位置其實是x的位置,這樣原來內存中x的位置就被k所賦的值代替了,就變為0了,這個時候要進行打印,就直接看內存里就行了,x的位置也就是k的位置是0,而y,z的位置的值沒有改變。
union和struct的區別
在struct類型中,所有數據成員是存儲在相鄰的內存中的。一個struct對象的大小事其所有數據成員的大小總和。
它有如下特性:
1.能夠用構造函數來初始化變量。
2.能夠有析構函數。
3.構造函數不能為虛函數。
4.成員變量默認是public權限。
struct不同成員的賦值是不會相互影響的。這點和union不同。
轉自:https://blog.csdn.net/xiajun07061225/article/details/7295355