C++11新特性(85)-类类型的union成员(1)

接下来的两篇文章介绍C++11的最后一个新特性:类类型的union成员。这个新特性涉及的内容较多,所以本文先做一些不属于C++11新特性的准备工作。

 

匿名union

我们通过一个例子类说明。假设有以下函数:

C++11新特性(85)-类类型的union成员(1)_第1张图片

这 个函数的功能是根据参数rt的要求产生随机数并转换为字符串。代码中首先为每一种场景准备了一个临时变量用于存储随机数生成器的输出。但是观察接下来的代 码我们发现这两个变量并不会同时使用,所以希望能优化一下。一个方法就是将变量定义移到switch分支内;另一个方法就是将这两个变量结合在一起定义一 个union。

 

但是这样做有点麻烦:一个是要为union起名字,另一个是要修改使用union成员的代码。解决这个问题的方法就是本节的标题:匿名union。代码修改如下:

C++11新特性(85)-类类型的union成员(1)_第2张图片

唯一的变化就是声明了一个没有名字的union。C++规定,位于匿名union所在作用域内的代码可以直接使用匿名union的成员。两个麻烦一次解决!

 

直接调用构造函数和析构函数

一 般来讲,构造函数/析构函数是对象被构造和销毁时自动执行,不需要程序员显示调用。其原因就是绝大多数情况下,申请内存/构造对象和析构对象/释放内存都 是打包执行的。但是在某种情况下希望将内存操作和对象操作分离,这时就需要需要对已经准备好的内存空间调用类的构造函数,同时希望调用析构函数后可以不释 放内存。示例代码如下:

C++11新特性(85)-类类型的union成员(1)_第3张图片

IntValue是特别简单的类示例,只包含一个整数成员以及构造/析构函数。

 

testConstDest首先使用allocator分配一块未构造的内存,然后在第三行针对pv指向的内存调用构造函数,生成的对象保存在指针piv中。

 

testConstDest第五行对piv显示调用析构函数后,利用allocator释放内存。

 

这里需要注意第三行,第五行的用法。详细信息可以参照C++ Primer(第五版)的19.1.2节:定位new表达式。

 

作者一句话

虽然不是新内容,但是一样很重要。

 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

C++11新特性(85)-类类型的union成员(1)_第4张图片

你可能感兴趣的:(C++)