为什么结构中的命名联合会覆盖其他结构成员?

Mar*_*Mao 2 c++ struct unions

struct TestStruct
{   
    int a;
    int b;

    union
    {
        char c[2];
        int d;
    };
};

TestStruct instance;
Run Code Online (Sandbox Code Playgroud)

如果我做

instance.a = 100; 
instance.b = 200; 
instance.d = 300;
Run Code Online (Sandbox Code Playgroud)

一切安好.

但是,如果我给工会一个名字:

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    };
};

TestStruct instance;
Run Code Online (Sandbox Code Playgroud)

我又做了同样的事情:

instance.a = 100;
instance.b = 200;
instance.ZZZ::d = 300;
Run Code Online (Sandbox Code Playgroud)

然后

instance.ZZZ::d = 300;
Run Code Online (Sandbox Code Playgroud)

覆盖instance.a300,为什么?!

此外,如果它具有名称,我无法在调试器监视列表中看到联合成员.

我正在使用Visual Studio 2008.

bam*_*s53 8

当您为联合命名时,类中不再有与之对应的数据成员,d因此instance.ZZZ::d = 300;并不意味着什么.(使用VS2012,我得到"错误C2039:'ZZZ':不是'TestStruct'的成员")

要拥有联合类型的成员,您必须为其命名.

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    } z;
};

instance.a = 100;
instance.b = 200;
instance.z.d = 300;
Run Code Online (Sandbox Code Playgroud)

C++对"匿名联合"有一个特殊规则,其中表单的未命名联合类型也会创建一个未命名的对象.union的成员名称被注入封闭范围并访问未命名对象的成员.union { member-specification };

当你没有在班级中命名联合类型时,这就是你得到的.但是只要你给类型命名,联合就不再匹配那个特殊规则了,并且在类中不再有一个未命名的联盟成员; 然后,您必须通过命名成员变量来正常添加联合数据成员.