Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C+中访问类的私有成员时必须在对象地址前面提到数据类型+;?_C++_Class_Oop_Pointers_Private - Fatal编程技术网

C++ 为什么在C+中访问类的私有成员时必须在对象地址前面提到数据类型+;?

C++ 为什么在C+中访问类的私有成员时必须在对象地址前面提到数据类型+;?,c++,class,oop,pointers,private,C++,Class,Oop,Pointers,Private,我正试图通过指针访问私人成员。我想知道为什么我们在(int*)&t前面提到dtype 类测试 { 私人: int数据; 公众: Test(){data=0;} int getData(){return data;} }; int main() { 试验t; int*ptr=(int*)&t; *ptr=10; cout(int*)&t:将指针强制转换为指向整数的指针 int*ptr=(int*)&t;:它在ptr中存储t的指针访问控制系统适用于名称。它是私有的名称数据,而不是任何变量或相关的存储

我正试图通过指针访问私人成员。我想知道为什么我们在(int*)&t前面提到dtype

类测试
{
私人:
int数据;
公众:
Test(){data=0;}
int getData(){return data;}
};
int main()
{
试验t;
int*ptr=(int*)&t;
*ptr=10;
cout
(int*)&t
:将指针强制转换为指向整数的指针


int*ptr=(int*)&t;
:它在ptr中存储t的指针访问控制系统适用于名称。它是私有的名称
数据,而不是任何变量或相关的存储区域。换句话说,只要不使用名称
数据
,您就可以以其他方式访问变量

访问控制的目的是防止代码意外中断

有时说C++给你足够的绳子来挂你自己,或者“保护Murphy而不是Macchiavelli”——换句话说,如果你真的想,你可以绕过访问控制。 当然,您应该尝试以不需要绕过访问控制的方式设计代码


在这种特殊情况下,代码是定义良好的。由于
Test
是a,因此可以保证在第一个数据成员之前没有填充,并且该转换生成指向
t.data
的指针,该指针可用于访问所述变量


对于更复杂的类,如果所讨论的数据成员不是从对象存储空间的开头开始的,那么代码可能无法工作。

它只是偶然地从开头开始工作

Test
是一个基本类,不涉及继承,不包含虚拟方法,在不支持RTTI的情况下编译,或者任何可能会膨胀内存中表示的东西

在这个简单的例子中,唯一的成员变量与整个对象位于同一个地址。这是非常不安全的,因为对于任何更复杂的对象,它都是未定义的行为

例如,现在尝试将继承和虚拟方法引入测试。突然,对象的前几个字节不再是第一个成员变量(编译器通常会在这里放置VPTR),测试崩溃得很厉害


或者将您的成员变量改为静态变量,现在您的对象本身实际上是空的,您可以访问堆控制结构,这不一定会导致立即崩溃,而是会导致更严重的堆损坏。在这种情况下,
t
是堆栈分配的,因此您只会损坏堆栈(这稍微不那么糟糕),但如果它是堆分配的,这将变得非常重要。

这毫无意义:int ptr=(int*)&t、 *如果需要直接访问值,请将
数据
公开。您可以为类创建访问和操作
数据
的方法。应避免在类自身范围之外直接操作类的成员。
class Test
{
private:
    int data;
public:
    Test() { data = 0; }
    int getData() { return data; }
};

int main()
{
    Test t;
    int* ptr = (int*)&t;
    *ptr = 10;
    cout << t.getData();
    return 0;
}