c++中的联合

来源:互联网 发布:js写99乘法表 编辑:程序博客网 时间:2024/05/17 04:35

最近工作中用到了联合这个类,根据联合中的所有变量共用一段内存,写了一个模板接口函数,而此接口函数只需往里面传入数据的类型和一个联合的引用,就可以在同一个数据结构中存储或者取出不同的数据类型(代码由于没整理出来,暂且不贴),感觉还比较好用,故对联合又多了解了点。
联合也是个c++类,但由于联合它自身的特性,所以联合少了很多一般c++类中的很多特性,比如:

1.联合类不能作为基类,也不能从别的类派生而来
2.正因为联合不能作为父类,也不能作为子类,故联合中不能有虚函数
3.联合中的成员变量一般是内置的数据类型,但也可以有自己定义的数据类型,但是联合中的变量的数据类型不能有自己定义的构造函数和析构函数
比如:
struct A
{
    int a;
    int b;
    A(){}
};
struct B
{
    int a;
    int b;
};
struct C
{
    A a;
};
union D
{
    A a;//错误,A类型中有自己定义的构造函数 
    B b;//正确
    C c;//错误,C类型中也有自己定义的构造函数
};
4.联合中也可以定义自己的构造函数,析构函数,可以有重载,有出了虚函数的其它函数

5.联合初始化时做到初始化内存最大的成员,而且只需初始化其中一个成员一次
如:
union D
{
   int a;
   double b;
   long long c;
   char buf[32];
};
而此时D类所占内存为32字节,buf为其中内存长度最长的数据成员只需要对buf进行初始化即可(因为这里最长的是char[]类型,故不能在初始化列表中初始化,这里只是赋值)
如:
D::D()
{
    memset(buf,0,sizeof(buf));
}
而以下错误
D::D():a(0),b(0),c(0)//b,c已经被初始化,不能被初始化两次(要分清初始化和赋值的区别)
{
    memset(buf,0,sizeof(buf));
}

原创粉丝点击