1、聯合(union)是一種特殊的類。一個union對象可以有多個資料成員,但是任何時刻,只有一個成員可以有值。當將一個值賦給union對象的一個成員的時候,其他所有成員都變為未定義的。每個 union 對象的大小在編譯時間是固定的:至少與最大資料成員的一樣大。
2、union不能作為基類使用,所以成員函數不能為虛函數。union不能具有待用資料成員或引用成員,而且,union不能具有定義了建構函式,解構函式或賦值操作符的類類型的成員。
3、預設情況下,union對象是未初始化的。可以用與顯式初始化、簡單類對象一樣的方法顯式初始化union對象。但是,只能為第一個成員提供初始化式,通過一對花括弧。通過訪問操作符(.和->)訪問union類型對象的成員。
4、給union對象的某個資料成員一個值使得其他資料成員變為未定義的。使用union對象時,我們必須知道union對象中當前儲存的是什麼類型的值。通過錯誤的資料成員檢索儲存在union對象中的值,可能會導致程式崩潰或其他不確定的程式行為。通常,我們避免錯誤訪問union成員的一個方法是:定義一個單獨的對象跟蹤union中儲存了什麼值,稱這個附加對象為union的判別式(discriminant)。
範例程式碼
#include <iostream>#include "string"using namespace std;class Token{public:enum TokenKind {INT1, CHAR1, DBL1};TokenKind tok;union TokenValue{char cval;int ival;double dval;}val;};union TokenValue2{char cval;int ival;double dval;};int main(){Token first_token;switch(first_token.tok){case Token::INT1:first_token.val.ival = 42;break;case Token::CHAR1:first_token.val.cval = '1';break;case Token::DBL1:first_token.val.dval = 3.14;break;default:break;}//初始化unionTokenValue2 second_token = {'a'};return 1;}
5、匿名(anonyous union)聯合
未命名的聯合。因為匿名union不提供訪問其成員的途徑,所以將成員作為定義匿名union的範圍的一部分直接存取。
first_token.cval = '1';
匿名union不能有私人成員或受保護的成員,也不能定義成員函數。
6、局部類
可以在函數體內部定義類,這樣的類稱為局部類(local class)。由於這樣的類使用的情況很少,使用時可以參見Primer第18章。