从Java到C++——union的使用方法

版权声明:本文为博主原创文章,未经博主同意不得用于不论什么商业用途,转载请注明出处。 https://blog.csdn.net/luoweifu/article/details/33342965


你是否记得union这个东西,在上大学的时候我们用的是潭浩强的《C语言程序设计》,里面把它译作是共用体。“共用体”。尽管翻译得特别别扭,但却正好说明了它的特性和用途。

联合union。也有翻译成共用体的是一种特殊的结构(或说类)

一个union能够有多个数据成员,可是在随意时刻仅仅有一个成员有值。

Union具有下面几个特点:

1.一个union能够有多个不同类型的数据成员。 但在某一时刻仅仅有一个成员有值(即仅仅有一个成员是有效的)

 给union的某个成员赋值后,该union的其他成员就成没有定义的状态了。例如以下演示样例:

// 測试1
union Token
{
    char cVal;      //char 类型
    int nVal;       //int类型
    double dVal;    //double类型
};

void PrintToken(const Token& t)
{
    cout << "char:   " << t.cVal << endl;
    cout << "int:    " << t.nVal << endl;
    cout << "double: " << t.dVal << endl;
}

void TestUnion1()
{
    cout << "Print first:"<< endl;
    Token t;
    t.cVal = 'k';
    PrintToken(t);

    cout << endl << "Print second:"<< endl;
    t.nVal = 5;
    PrintToken(t);
    cout << endl;

    cout << endl << "Print third:"<< endl;
    t.dVal = 10.2;
    PrintToken(t);
}
结果例如以下:



2.分配给一个union对象的存储空间,至少要能容纳它的最大的数据成员(即一个union的存储空间至少要为其各个成员的数据类型中占字节数最大的一个成员的字节大小)

例如以下演示样例:

//測试2
union Token
{
    char cVal;      //char 类型。 1 个字节
    int nVal;       //int类型。 4个字节
    double dVal;    //double类型, 8个字节
};

union Token2
{
  short snVal;      //2个字节
  int nVal;         //4个字节
};

union Token3
{
  int nVal;         //4个字节
  float fVal;       //4个字节
  long lVal;        //4个字节
  char arr[20];     //20个字节
};

void TestUnion2()
{
    cout << "size of Token: " << sizeof(Token) << endl;
    cout << "size of Token2:" << sizeof(Token2) << endl;
    cout << "size of Token3:" << sizeof(Token3) << endl;
}
结果例如以下:



3.假设一个union结构中有多个同样类型的数据成员,则这些数据成员会有同样的值。

union应该是依据成员占用的内存最大的数据类型的大小分配一段内存空间。无论你使用的是那个成员变量,内存空间地址和大小都同样。当然以上就是依据測试的样例个人进行的判断,在这个样例中char的空间首地址输出有问题,可能跟操作系统有关系。我用的是UbuntuLinux操作系统,例如以下演示样例:

//測试3
union Token4
{
    unsigned char cVal1;
    unsigned char cVal2;
    short int snVal;
    int nVal;
    long lVal;
    long long llVal;
    double dVal;
    double dVal2;
};

void PrintToken4(const Token4& t)
{
    cout << "char1:    " << t.cVal1 << "\t\t\t" << &t.cVal1 << endl;
    cout << "char2:    " << t.cVal2 << "\t\t\t" << &t.cVal2 << endl;
    cout << "short int:" << t.snVal << "\t\t\t" << &t.snVal << endl;
    cout << "int:      " << t.nVal << "\t\t" << &t.nVal << endl;
    cout << "long:     " << t.lVal << "\t\t" << &t.lVal << endl;
    cout << "long long:" << t.llVal << "\t" << &t.llVal << endl;
    cout << "double1:  " << t.dVal << "\t\t" << &t.dVal << endl;
    cout << "double2:  " << t.dVal2 << "\t\t" << &t.dVal2 << endl;
}

void TestUnion4()
{
    cout << "Print first:"<< endl;
    Token4 t;
    t.cVal1 = 'A';
    PrintToken4(t);

    cout << endl << "Print second:"<< endl;
    t.nVal = 255;
    PrintToken4(t);
    cout << endl;

    cout << endl << "Print third:"<< endl;
    t.dVal = 10.2;
    PrintToken4(t);
}
结果例如以下:




4.C++的早期版本号中(C++11标准之前)。union不能含有定义了拷贝构造函数或拷贝控制成员的类类型成员。但在C++11标准之后取消了这一限制。能够含有类的成员,如string及自定义的类。含有拷贝构造函数或拷贝控制成员的类类型成员的union比較复杂,能够去參考C++11标准的相关文档。

posted @ 2018-12-06 08:29  ldxsuanfa  阅读(278)  评论(0编辑  收藏  举报