c++11中union除了继承c语言的数据共享内存之外,行为上越来越像一个类,比如成员默认是public类型。c++11中的新特性:
1、能够有成员函数,包括构造函数和析构函数
union U //C++11
{
int a;
int b;
char* p;
U() : a(5) {} //ctor with mem init
U(U&& r) { p=r.p; r.p=0;} //move ctor
U&& operator=(U&& r)
{ p=r.p; r.p=0; return *this;} //move assignment op
~U() {delete [] p; } //dtor
}
2、不能继承,也不能被继承,也不能有虚函数
class P{};
union U: P {}; //compilation error
class C : public U{}; //also a compilation error
union U //C++11
{
int a;
int b;
char* p;
virtual ~U() {delete [] p; } //compilation error, virtual
};
3、可以有成员变量是类,但是这个类成员不能有自己定义的构造、拷贝、析构、赋值等函数,否则编译不过(至少在vs2012上是的)
自己定义的构造、拷贝、析构、赋值函数称为non-trivial函数,默认的则称为trivial函数,相关内容参考链接3和4
4、不能有引用成员,不管是左值引用还是右值引用,不能有静态成员变量,但是可以有静态成员函数
union U
{
int & r; //compilation error
double && rr; //also a compilation error
};
union U
{
int a;
static void func(){}
};
5、在类的内部使用union,整个类包装联合体
class C
{
union //anonymous union
{
int a;
char* p;
};
};
参考链接:
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=556
http://bbs.youkuaiyun.com/topics/80436802
http://www.freezhongzi.info/?p=147
http://bbs.youkuaiyun.com/topics/110162419