c++中的聯合

最近工作中用到了聯合這個類,根據聯合中的所有變量共用一段內存,寫了一個模板接口函數,而此接口函數只需往裏面傳入數據的類型和一個聯合的引用,就可以在同一個數據結構中存儲或者取出不同的數據類型(代碼由於沒整理出來,暫且不貼),感覺還比較好用,故對聯合又多瞭解了點。
聯合也是個c++類,但由於聯合它自身的特性,所以聯合少了很多一般c++類中的很多特性,比如:

1.聯合類不能作爲基類,也不能從別的類派生而來
2.正因爲聯合不能作爲父類,也不能作爲子類,故聯合中不能有虛函數
3.聯合中的成員變量一般是內置的數據類型,但也可以有自己定義的數據類型,但是聯合中的變量的數據類型不能有自己定義的構造函數和析構函數
比如:
struct A
{
    int a;
    int b;
    A(){}
};
struct B
{
    int a;
    int b;
};
struct C
{
    A a;
};
union D
{
    A a;//錯誤,A類型中有自己定義的構造函數 
    B b;//正確
    C c;//錯誤,C類型中也有自己定義的構造函數
};
4.聯合中也可以定義自己的構造函數,析構函數,可以有重載,有出了虛函數的其它函數

5.聯合初始化時做到初始化內存最大的成員,而且只需初始化其中一個成員一次
如:
union D
{
   int a;
   double b;
   long long c;
   char buf[32];
};
而此時D類所佔內存爲32字節,buf爲其中內存長度最長的數據成員只需要對buf進行初始化即可(因爲這裏最長的是char[]類型,故不能在初始化列表中初始化,這裏只是賦值)
如:
D::D()
{
    memset(buf,0,sizeof(buf));
}
而以下錯誤
D::D():a(0),b(0),c(0)//b,c已經被初始化,不能被初始化兩次(要分清初始化和賦值的區別)
{
    memset(buf,0,sizeof(buf));
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章