我有以下代码可以访问和更改类外的私有成员
#include<iostream>
#include<conio.h>
using namespace std;
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();
getch();
return 0;
}
它基本上是反对封装..我想知道为什么存在访问私有成员的这种技术?如何发生这种情况..请解释一下???
如果有这样的技术,那么将成员私有化的用途是什么?
答案 0 :(得分:3)
因为C ++可以防止意外而非故意规避(欺诈)。 只有硬件可以防止恶意使用通用语言,甚至在现实系统中也很难做到。
Bjarne Stroustrup在他的着作&#34; C ++编程语言&#34;中提到。
答案 1 :(得分:0)
简短回答:它不起作用。
为什么“有效”?
对象的大小为4个字节(cout << size(t);
),这是整数的大小。
这就是为什么这似乎有效,当你说这个int* ptr = (int*)&t;
时,你说t
的这4个字节将是int
的4个字节。
位于代码
下方此类是POD(忽略构造函数)(see more)
函数int getData() { return data; }
由编译器内联(我不确定),因此return data
返回*ptr
而不是data
的值。
使用int getData() { cout << data; }
对其进行测试,ptr
永远不会触及值数据。这称为未定义行为。
如果你的班级有这个私人成员(例子):
int foobar;
int data;
然后你的t
类的大小为8个字节,当将t
转换为int
时,你得到前4个字节,这是变量foobar({{ 3}})。此行cout << t.getData();
将返回0,这是构造函数中特定的值。