联合构造函数导致未定义的行为?

时间:2011-08-29 01:31:32

标签: c++ unions

在构造对象后,我将NumericType Values (10, 3.1416, 20)的值设为20, 3.1416, 20。是union定义的构造函数的行为吗?

union NumericType
{
    NumericType() {}

    NumericType(int i, double d, long l)
    {
        iValue = i;
        dValue = d;
        lValue = l;
    }

private:
    long        lValue; 
    int         iValue; 
    double      dValue;
};


int main()
{
     union NumericType Values ( 10, 3.1416, 20 );
}

2 个答案:

答案 0 :(得分:2)

你正在做的事情没有意义。因为它是一个联合,你将分配给相同的内存区域3次。因为您在构造函数 last 中分配给lvalue,所以这就是所有内容。所有三个变量都在同一个位置并占用相同的内存(dValue除外,它占用的字节数比其他两个多4个。)

您可能想要一个struct,而不是union(因为在struct中,所有变量都是分开的,将一个变量设置为某个变量不会影响其他变量。)

Here's a good visualization(请记住,这个块只有一个8字节的内存块,而不是3块):

http://i.msdn.microsoft.com/dynimg/IC66560.gif

答案 1 :(得分:1)

请记住,union中的元素共享内存,因此拥有一个初始化所有元素的构造函数会丢弃信息。

那就是说,这不是有效的C ++。