39、C++ Primer 4th筆記,特殊工具與技術,聯合(union)

來源:互聯網
上載者:User

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章。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.