您的位置:首页 > 编程语言 > C语言/C++

联合体的使用(c++)

2014-04-03 22:07 295 查看

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: