为了账号安全,请及时绑定邮箱和手机立即绑定

为什么同一类的对象可以访问彼此的私有数据?

为什么同一类的对象可以访问彼此的私有数据?

C++
拉莫斯之舞 2019-08-12 16:01:31
为什么同一类的对象可以访问彼此的私有数据?为什么同一类的对象可以访问彼此的私有数据?class TrivialClass {public:    TrivialClass(const std::string& data) :     mData(data) {};   const std::string& getData(const TrivialClass& rhs) const {     return rhs.mData;   };private:   std::string mData;};int main() {   TrivialClass a("fish");   TrivialClass b("heads");   std::cout << "b via a = " << a.getData(b) << std::endl;   return 0;}这个代码有效。对象a完全可以从对象b访问私有数据并将其返回。为什么会这样?我认为私人数据是私人的。(我开始试图理解pimpl习语中的复制构造函数,但后来我发现我甚至不理解这种简单的情况。)
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

因为这就是它在C ++中的工作方式。在C ++中,访问控制基于每个类而不是基于每个对象。

C ++中的访问控制是作为静态编译时功能实现的。我认为很明显,在编译时实际上不可能实现任何有意义的每对象访问控制。只有每类控制才能实现。

受保护的访问规范中存在一些每对象控制的提示,这就是为什么它甚至在标准中有自己的专用章节(11.5)。但是,那里描述的任何每个对象的特征仍然相当简陋。同样,C ++中的访问控制意味着在每个类的基础上工作。


查看完整回答
反对 回复 2019-08-12
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

这是一个很好的问题,我最近遇到过这个问题。我与同事们进行了一些讨论,这是我们讨论的总结:这是设计的。这并不意味着这种设计对于所有情况都是完全合理的,但必须考虑为什么选择每个类私有。我们可以想到的可能原因包括:

首先,每个实例访问控制的成本可能非常高。这个帖子中的其他人已经讨论过这个问题。理论上,这可以通过指针检查来完成。但是,这不能在编译时完成,并且只能在运行时完成。因此,您必须在运行时识别每个成员的访问控制,并且当它被违反时,可能只会引发异常。成本很高。

其次,每个类访问控制都有自己的用例,比如copy constructor或operator =。如果每个实例都有访问控制,那么很难实现它们。

此外,访问控制主要来自编程/语言角度,用于如何模块化/控制对代码/成员的访问,而不是数据


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 490 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信