为啥我可以通过指针访问私有数据成员,我应该这样做吗?

Posted

技术标签:

【中文标题】为啥我可以通过指针访问私有数据成员,我应该这样做吗?【英文标题】:Why can I access private data members through pointers and should I do this?为什么我可以通过指针访问私有数据成员,我应该这样做吗? 【发布时间】:2014-06-21 23:59:50 【问题描述】:

我刚刚发现我可以在 C++ 中做到这一点,它编译得很好(MinGW 和 VC++):

class A

private:
   void doSth();
   A* foo;
   A* bar;
;

void A::doSth()

  foo->bar;

foo 的成员字段 bar 是私有的。 为什么我可以访问它?我应该这样做吗?

【问题讨论】:

请张贴其隐私证明。 如果私有变量完全无法访问,那现在就不是很有用了..:) 如果它是非法的,你将无法对私人会员做任何事情。 +1。这是一个很好的问题,因为我可以看到指针如何将正在发生的事情与可见性混淆。 @Ben 也许 OP 喜欢 player。有什么关系?哎呀。 【参考方案1】:

在 C++ 中,private 表示访问仅限于同一个类,而不是同一个对象实例。

【讨论】:

谢谢,我会尽快接受。我不知道访问修饰符是基于类的。认为它们是基于实例的。【参考方案2】:

您还会注意到,在 A 的方法中,可以访问 A 的私有变量的其他实例。喜欢

A::baz(A& other) 
    other.bar; // legal

可见性是在类级别,而不是实例级别。

【讨论】:

为什么要添加另一个答案而不是编辑第一个答案? @luk32 因为第一个是错误的,这是不同的。我没有正确理解这个问题。 那么......为什么不编辑错误的呢?也许我没有看到待删除的内容。这很尴尬。 @djechlin 编辑您发布到正确答案的第一个答案没有帮助吗? @luk32 因为我认为将一个答案变形为完全不同的答案是愚蠢的。一方面,投票变得毫无意义。也许真正喜欢我明显错误答案的人不会喜欢我的正确答案。

以上是关于为啥我可以通过指针访问私有数据成员,我应该这样做吗?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中,如果这样写,为啥私有数据成员可以在类外部访问? [复制]

为啥我不能访问 TypeScript 私有成员?

为啥我应该在属性访问器中使用私有变量?

为啥这个朋友功能不能访问类的私有成员?

为啥我不能访问指向数组中成员函数的指针?

指向具有私有构造函数的类的类成员的指针