union知識要點小結(精要)

PCL中存儲點的數據類型用到了聯合體union,於是深入研究了union類型。

1. C++ Primer:一種節省空間的類——union

2. 概念:

     union是一種特殊的類,它定義了一種新的類型。

     1)一個union可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值;

     2)當我們給union的某個成員賦值之後,該union的其他成員就變成未定義的狀態了;

     3)分配給一個union對象的存儲空間至少要能容納它的最大的數據成員

3. 聲明要點:

     1)union不能含有引用類型的成員

     2)在C++11新標準中,含有構造函數或析構函數的類類型也可以作爲union的成員類型。

     3)默認情況下,union的成員都是公有的。與struct相同。可以爲其成員指定public、protected和private等保護標記。

4.使用要點:

     1)union既不能繼承自其他類,也不能作爲基類使用,所以在union中不能含有虛函數;

     2)如果提供了初始值,則該初始值被用於初始化union的第一個數據成員。eg. Token first_token={ 'a' };   //Token爲一個union

     3)由於爲union的一個數據成員賦值會令其他數據成員變成未定義的狀態。因此,當使用union時,必須清楚地知道當前存儲在union中的值到底是什麼類型;

5. 含有類類型的union

     1)如果union含有類類型的成員,並且該類類型自定義了默認構造函數或拷貝控制成員,則編譯器將爲union合成對應的版本並將其聲明爲刪除的delete。

           即:union中含有類類型成員時,必須自定義該union的默認構造函數和拷貝控制成員,否則該union不能默認構造和拷貝構造。

     2)通常把含有類類型成員的union內嵌在另一個類當中。這個類可以管理並控制與union的類類型成員有關的狀態轉換。

           爲了追蹤union中到底存儲了什麼類型的值,通常會定義一個獨立的對象,比如enum類型的對象,該對象成爲union的判別式(discriminant)。我們可以使用判別式辨認union存儲的值。判別式與union應該相互獨立的存在於當前類中。

     3)賦值函數定義時,往往需要使用定位new表達式;

發佈了18 篇原創文章 · 獲贊 7 · 訪問量 9324
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章