【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成员的描述
【c++】关于在联合体中使用string_第1张图片

总结

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

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

你可能感兴趣的:(#,C/C++,c++)