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数据类型提供一组访问函数。