const /非const对象指针的联合

时间:2013-08-05 16:35:23

标签: c++ const

请考虑以下示例代码:

class A
{
public:

    A() : n(0) {}

    int n;
};

class B
{
public:

    B(A* a) : mA(a) { }
    B(const A* a) : mConstA(a) { }

    union {
        A* mA;
        const A* mConstA;
    };
};

int main()
{
    A a;
    B b1(&a);
    B b2(const_cast<const A*>(&a));

    return 0;
}

在构造时,b1会有一个指向a的可变指针,而b2会有一个指向a的不可变指针。在这种情况下,b1.mA等于b2.mConstAb1.mConstA等于b2.mA

当你有const和非const对象指针的联合时,这些等式是否总是正确的?

同样,下面的代码编译/运行正常:

int main()
{
    const A a;
    B b(&a);
    b.mA->n = 3; // Blasphemy!!!

    return 0;
}

但保证b.mA始终等于b.mConstA

1 个答案:

答案 0 :(得分:2)

  

当你有const和非const成员的联合时,这些等式是否总是正确的?

是的,两个指针都将引用同一地址中的同一个对象。内存中的位将是相同的。

  

但保证b.mA始终等于b.mConstA?

是的,它们的值会相同,但这并不意味着您可以使用它。这相当于使用const_cast,您将获得一个指向该对象的非const指针,但如果该对象确实是const,则使用该指针修改该对象是未定义的行为。