公共函数是否可以返回指向类中私有变量的指针。如果是这样/如果没有,会发生什么?它会崩溃还是有什么高度不安全的?可以读取或写入指向的数据吗? 感谢
答案 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();
你 仍然可以修改。