可以通过其地址访问私有变量吗?

时间:2010-08-08 00:17:46

标签: c++

公共函数是否可以返回指向类中私有变量的指针。如果是这样/如果没有,会发生什么?它会崩溃还是有什么高度不安全的?可以读取或写入指向的数据吗? 感谢

5 个答案:

答案 0 :(得分:23)

是的,成员函数可以将指针(或引用)返回给私有数据成员。 错误除了在大多数情况下它破坏了封装之外没有错误

当然可以通过返回的指针或引用读取数据成员。是否可以写入取决于返回的指针或引用是否是const限定对象(即,如果返回const T*,则无法修改指向的{{ 1}})。例如:

T

答案 1 :(得分:3)

是的,可以退回,可以读取和写入。它比获取任何其他变量的地址没有或多或少危险。 public / private / protected是在编译时检查的语法结构,它们不是“传染性的”或某种类型的东西。

答案 2 :(得分:1)

私有成员与公共成员或任何其他类型的实例没有区别。所以,是的,你可以指点它们,并返回它们。

当指向任何基于实例的成员时,必须小心不要删除父类,并且不要超出范围,除非你接受该指针并创建数据/对象的真实副本指着。如果它被删除或超出范围,指针将成为一个悬空指针,如果没有你的应用程序爆炸(或处理不存在的对象,从而使你的程序做出疯狂的意外事情,你不能再使用它)崩溃)。

设计考虑因素:

公开您的任何内部实施细节可能违反了封装。但是,如果您只想封装您正在返回的对象如何创建/检索,那么这是一个合理的解决方案。这将允许您更改类以其他方式获取成员对象(如查询文件或内部字典),而不会破坏调用这些方法的代码。

答案 3 :(得分:1)

“它会崩溃还是有任何高度不安全的东西?可以读取或写入指向的数据吗?”

private / protected / public在运行时没有任何影响,因此它们不会影响程序执行甚至崩溃程序。它们在编译时进行检查,只会导致编译器在编译时发生错误。

答案 4 :(得分:0)

const限定符不会在这些情况下保护您。考虑到詹姆斯的回复,请尝试将const int *转为int *

int* cp = (int*)e.get_const();

仍然可以修改。