在C ++中访问类的私有成员

时间:2014-03-30 19:43:07

标签: c++ class pointers

我有以下代码可以访问和更改类外的私有成员

#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;
} 

它基本上是反对封装..我想知道为什么存在访问私有成员的这种技术?如何发生这种情况..请解释一下???

如果有这样的技术,那么将成员私有化的用途是什么?

2 个答案:

答案 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,这是构造函数中特定的值。