本篇内容介绍了“C++11中union的成员举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
类类型的union成员
C++的早期版本不允许union的成员是定义了构造函数或拷贝控制成员的类类型成员,C++11中取消了这个限制。但是也别高兴得太早,因为这类union在发生涉及到类类型成员的值转换时需要根据需求调用相关类成员的构造函数或析构函数。
假设我们有下面的StrValue类。引入这个类的目的是为了在对象操作时可以输出日志信息。
代码有点长,慢慢看。这个类主要用于存储字符串。它包含3个构造函数,一个析构函数,一个赋值运算符。另外还重载了输出运算符用于输出内部的字符串。C++11以后,允许把这个类作为下面union的成员。
为union引入类类型成员后,带来了一个麻烦:在切换union有效成员的时候需要恰当的调用类成员的构造函数和析构函数。例如下面的代码:
最初有效的是ival成员,接下来希望存储字符串时需要使用定位new方式调用构造函数;反之,当我们希望再次使用ival成员的时候,又需要调用sval成员的析构函数。如果不这样做,就无法保证内存管理正常进行。
使用类管理union成员
解决上述问题的方法就是C++最基本的特征:封装。我们可以将union封装到另一个类中。
我们分类说明SmartUnion类的各个成员。
两个数据成员,一个是用于保存类型信息的ut,通过这个成员,SmartUnion类可以判断当前是哪个成员有效;另一个是包含整数和StrValue成员的匿名union,它是主角。
三个构造函数,一个默认构造函数,另外两个分别接受整数和字符串输入。注意这里的SmartUnion只是示例代码,真正使用的时候可能还要添加不少内容,例如拷贝构造函数。
三个赋值运算符,分别提供从整数,StrValue对象和SmartUnion对象赋值的功能。
经过一番准备之后,用法就简单了:
“C++11中union的成员举例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。