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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章