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