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表達式;