C++ 私有变量可以通过其地址访问吗?
公共函数是否可能返回指向类中私有变量的指针。如果是/如果不是,会发生什么?它会崩溃吗?或者这有什么高度不安全的地方吗?可以读取或写入指向的数据吗?C++ 私有变量可以通过其地址访问吗?,c++,C++,公共函数是否可能返回指向类中私有变量的指针。如果是/如果不是,会发生什么?它会崩溃吗?或者这有什么高度不安全的地方吗?可以读取或写入指向的数据吗? 谢谢是,成员函数可以返回指向私有数据成员的指针(或引用)。这并没有什么错,只是在大多数情况下它破坏了封装 数据成员当然可以通过返回的指针或引用读取。是否可以写入取决于返回的指针或引用是否指向常量限定对象(即,如果返回const T*,则无法修改指向T)。例如: class Example { public: int* get()
谢谢是,成员函数可以返回指向私有数据成员的指针(或引用)。这并没有什么错,只是在大多数情况下它破坏了封装 数据成员当然可以通过返回的指针或引用读取。是否可以写入取决于返回的指针或引用是否指向常量限定对象(即,如果返回
const T*
,则无法修改指向T
)。例如:
class Example
{
public:
int* get() { return &i; }
const int* get_const() const { return &i; }
private:
int i;
};
int main()
{
Example e;
int* p = e.get();
int a = *p; // yes, we can read the data via the pointer
*p = 42; // yes, we can modify the data via the pointer
const int* cp = e.get_const();
int b = *cp; // yes, we can read the data via the pointer
*cp = 42; // error: pointer is to a const int
}
是的,它可以返回,也可以读写。它与获取任何其他变量的地址一样危险。Public/private/protected是在编译时检查的语法结构,它们不会“传染”或是某种类型的一部分。私有成员与公共成员或任何其他类型的实例没有区别。所以,是的,你可以将指针指向它们,然后返回它们 当获取指向任何基于实例的成员的指针时,必须小心父类不会被删除,也不会超出范围,除非获取该指针并创建它所指向的数据/对象的真实副本。如果它被删除或超出范围,指针将变成一个悬空的指针,如果你的应用程序不爆炸(或处理不存在的对象,从而使你的程序做疯狂的意外事情,但不会崩溃),你就不能再使用它了 设计注意事项: 公开任何内部实现细节都可能违反封装。但是,如果您只想封装如何创建/检索返回的对象,那么这是一个合理的解决方案。这将允许您更改类,以通过其他方式(如查询文件或内部字典)获取成员对象,而不破坏调用这些方法的代码。“它会崩溃吗?这是否有任何高度不安全的地方?是否可以读取或写入指向的数据?”
private/protected/public在运行时没有任何效果,因此它们不会影响程序执行,甚至不会使程序崩溃。它们在编译时被检查,如果存在冲突,只会导致编译器在编译时抛出错误。const限定符在这些情况下不会保护您。考虑到詹姆斯的回答,请尝试将
const int*
转换为int*
int* cp = (int*)e.get_const();
你仍然可以修改.< /p>见有效C++项目28。这种方法是危险的。它很容易崩溃int*x=Example().get();删除x;int*y=Example().get()//Crashes@jack伦敦:IMO,在C++中,如果你要做手动内存管理,你就不能在任意指针上调用<代码>删除>代码,并希望能逃脱它。如果你是手动管理内存,你必须知道你在做什么。@jack:这并不比
inti;删除&i代码>。