union(C/C++)使用的一些总结

1、联合里面那些东西不能存放? 我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。

2、类可以放入联合吗? 我们先看一个例子:
class TEST
{
public:
 TEST():data(0) { }
private: int data;
};

TYPEdef union _TEST
{TEST TEST; }UI;

编译通不过,为什么呢?
因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,
因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。

3、又是匿名惹的祸??
我们先看下一段代码:
class TEST
{
public:
 TEST(const CHAR* p);
 TEST(int in);
 const operator CHAR*() const
 {
  return data.ch;
 }
 operator long() const
 {
  return data.l;
 }
private:
 enum TYPE {Int, String };
union
{
 const CHAR* ch;
 int i;
}dataTYPE;

TYPE sTYPE;

TEST(TEST&);
TEST& operator=(const TEST&);
};
TEST::TEST(const CHAR *p):sTYPE(String),dataTYPE.ch(p)
{ }
TEST::TEST(int in):sTYPE(Int),dataTYPE.l(i)
{ }
看出什么问题了吗?呵呵,编译通不过。
为什么呢?难道dataTYPE.ch(p)和dataTYPE.l(i)有问题吗?
在构造函数中当然要调用其成员的构造函数,所以其要去调用dataTYPE成员的构造函数,
但是他没有构造函数可调用,所以出错。
注意了,这里可并不是匿名联合!因为它后面紧跟了个data!

4、如何有效的防止访问出错?
使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值!
例如上面的ch、i交错访问。为了防止这样的错误,我们必须定义一个额外的对象,
来跟踪当前被存储在联合中的值得类型,我们称这个额外的对象为:union的判别式。
一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值