联合体的使用(c++)

1、联合体中的对象成员

c++中union不可以存储有自定义构造函数的类的对象实例,但可以存储不同类型对象的指针(指针是4字节地址)。

否则不能通过编译,错误的代码如下:

class myclass
{
public:
	myclass(long l):data_(l){}
 int data_;
};
typedef union _tagutype_
{
 testunion obj;
}ut;

把上面代码中的类型myclass中的自定义够着函数去掉。正确代码如下:

class testunion
{
public:
 int data_;
};
typedef union _tagutype_
{
 testunion obj;
}ut;


2、类中联合体成员的具体初始化

在类中具体初始化联合体对象时,需要联合体含有自定义的构造函数,才能在类的构造函数的初始化列表中初始化联合体成员(默认的构造函数不带参数)。否则不能通过编译。

以下代码会编译出错

class myclass
{
	union 
	{
		const char* ch_;
		long l_;
	} data_;
	myclass(myclass&);
	myclass& operator=(const myclass&);
public:
	myclass(const char* ch);//构造函数
	myclass(long l);//构造函数
	operator const char*() const {return data_.ch_;}//操作符取值
	operator long() const {return data_.l_;}//操作符取值
};
myclass::myclass(const char* ch):data_.ch_(ch){}//不能在初始化列表直接访问联合体的成员来初始化
myclass::myclass(long l):data_.l_(l){}
int main (void) 
{
	myclass pszobj("yuankai");
	myclass lobj(1234);
	return 0;
}

联合体的具体初始化需要自定义构造函数。

正确的代码如下:

class myclass
{
	union dataunion //不能匿名
	{
		dataunion(const char*); //声明const char*构造函数
		dataunion(long); //声明long构造函数
		const char* ch_;
		long l_;
	} data_;
	
	myclass(myclass&);
	myclass& operator=(const myclass&);
public:
	myclass(const char* ch);//构造函数
	myclass(long l);//构造函数
	operator const char*() const {return data_.ch_;}//操作符取值
	operator long() const {return data_.l_;}//操作符取值
};
myclass::dataunion::dataunion(const char* ch):ch_(ch){}//联合体构造函数实现
myclass::dataunion::dataunion(long l):l_(l){}//联合体构造函数实现
myclass::myclass(const char* ch):data_(ch){}//联合体构造函数初始化data_(ch)
myclass::myclass(long l):data_(l){}//联合体构造函数初始化data_(l)




你可能感兴趣的:(联合体的使用(c++))