Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 私有变量可以通过其地址访问吗?_C++ - Fatal编程技术网

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