匿名聯合體的 妙處

2021-08-14 06:57:17 字數 1104 閱讀 8411

在類內部其實是可以定義一些型別的,比如struct、union、class,其實也就只有這三類可以被定義,

也只有這三類可以定義它們各自的物件,然後「.」出來或者「->」出來,c++中只有這三類了。

對於它們各自來說,在乙個類的內部都可以有三種方式來定義它們,比如對於union,

第一種方式://定義了乙個union型別,並且定義了乙個屬於該型別的物件un,因此sizeof(x)==4

class xun;

};第二種方式://定義了乙個union型別,但並沒有定義屬於該型別的任何物件,因此sizeof(x)==0

class x;

};第三種方式://定義了乙個匿名的union型別,因此也就只能在x內部使用了,並且此種情況隱含著已經

在x中定義了乙個屬於該匿名union型別的物件,因此sizeof(x)==4,並且此種情況最為特殊,可以直接

通過類x的物件來使用m_nx和pchar,例如x x;x.m_nx=10;x.pchar="hello world!";

class x;

};對於前兩種方式,都在類的內部定義了乙個新的具有名字的型別,因此可以用這種新的型別來定義對應

於該型別的物件,例如:x::un myun;但是這種定義是要求類內部的union在定義時的修飾符為public,

否則就不能在類外部定義屬於他們的物件,而只能在給類x內部使用了。

同理也可以知道在類內部通過typedef定義出來的新型別也是如此。

需要說明的是,union用類裡以第三種定義的方式出現的話,會有很奇妙的效果,非常奇妙,或許在今

後的程式設計過程中可以加以利用。m_nx和pchar共享一塊4個位元組的記憶體,只要不是同時需要m_nx和pchar

出現的情況都可以只利用它們其中的乙個,從而節省了記憶體開銷。

匿名聯合的另乙個用途是:自動型別轉換(自動型別轉換是不安全的)。例如:當要把乙個指標看作十進位制數時,你可以如下面的聯合一樣宣告。

int some_val;

union

;p = &some_val;

現在沒有必要把指標顯式的轉為int型別的:

str::cout << 」address of p is:」 << n << std::endl;

聯合體詳解

在c c 程式的編寫中,當多個基本資料型別或復合資料結構要占用同一片記憶體時,我們要使用聯合體 當多種型別,多個物件,多個事物只取其一時 我們姑且通俗地稱其為 n 選1 我們也可以使用聯合體來發揮其長處。首先看一段 union型別是共享記憶體的,以size最大的結構作為自己的大小,這樣的話,myun...

關於聯合體

一 聯合體 聯合體的每個成員共享一塊記憶體,這塊記憶體的大小就是聯合體占用記憶體的大小。這塊記憶體至少有其中占用記憶體最大成員的大小,有時候大於是因為有時候要考慮記憶體對齊。二 聯合體的作用 1.可以判斷平台屬於大端儲存還是小端儲存 2.共享記憶體 程序間通訊 的時候可以使用 3.在通訊程式中,有時...

聯合體 位域結構體 聯合體的妙用

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別 不是同事儲存 呢?答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union。定義乙個聯合型別的一般形式為 union...