【c++】关于在联合体中使用string

引言

共用体(union),又名联合体,是一种特殊的类;从C语言继承而来,其基本语义没有发生什么变化,只是具有了类的一些特性(允许定义成员函数)。在实际的编程实践中,使用频率没有struct高。与struct相比,最显著的区别是union的数据成员共享同一段内存,以达到节省空间的目的。

需求场景

函数对外暴露的某一个入参可能是多种数据类型,其中就包括了字符串;在这里我想用联合体来实现此功能,通过定义不同数据类型的构造函数来达到赋值的目的。

正文

union中如果放入string数据作为其成员变量的话,需要重新定义其析构函数。
但是,划重点:c++中的union中数据成员是不允许有构造函数的
因为union数据成员共享内存,union构造函数在执行的时候,不能调用数据成员为类对象的构造函数,否则就改变了其他数据成员的值;同样,union的对象成员的析构函数也不能被调用,因为其他数据成员的值对于对象成员而言可能毫无意义。

但是如果不通过构造函数的方式对string成员进行赋值,而是通过默认初始化的方式来赋值的话是可以正常运行的。
如果非要通过构造函数的方式对非基本数据类型进行赋值的话,可以通过replace new的方式进行赋值。示例代码如下:

union ErrorCode {
public:
	ErrorCode(int param) {
		a = param;
	}
	ErrorCode(std::string param) {
		new (&str) std::string(param);
	}
	ErrorCode(const char* param) {
		new (&str) std::string(param);
	}
	~ErrorCode() {
	}
	int a;
	std::string str;

};

该代码实测在win环境下可以正常运行,在linux环境下会core掉。
下图是zeal 中关于union成员的描述
zeal 描述

总结

总结下来就是,union因为是共享内存,因此其数据成员不能是带有构造函数的抽象类型数据。

参考
深入了解C++ 结构体(struct)与共用体(union)
C++ struct与union

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值