为什么c ++允许通过指针访问类的私有成员?

时间:2015-04-06 04:03:00

标签: c++ pointers encapsulation private-members

#include<iostream>
using namespace std;

class A
{
    int value;
 public:
    A(){value = 1;}
    ~A(){}

    void print(){cout << value << endl;}
 };

int main()
{
    A a;
    int* p = (int*)(&a);
    *p = 20;
    a.print();//output is 20.
}

这不会破坏课程的封装吗?我是c ++的初学者。我从未见过这种方法可以访问本书中的一个类的私人成员&#34; c ++ primer&#34;。

2 个答案:

答案 0 :(得分:2)

这是允许的,因为A是一个standard_layout类,它是一个与其他语言的布局兼容的类,这意味着它可以传递给用其他语言编写的函数。 C ++。它打破了封装,但这不是你通常想要在C ++领域做的事情,它是兼容性功能。

因为你是初学者,所以你几乎肯定想避免做任何涉及使用c风格演员/ reinterpret_cast的事情。信任类型系统和访问控制,它们可以帮助您 - 如果您覆盖它们,您需要确切地知道原因,这显然不是这里的情况。

答案 1 :(得分:1)

您的代码本质上是未定义的行为。通过以下几行:

int* p = (int*)(&a);
*p = 20;

你正在取消引用一个类型惩罚的指针,尽管这种类型惩罚不遵守严格的别名规则。要获得正确版本的代码,A应为聚合类型,请参阅键入别名部分here。在您的代码中,A实际上不是聚合类型,因为它包含私有成员。请参阅聚合类型here的定义。