[Union]C++中Union學習筆記


 

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM