为什么同一类的对象可以访问彼此的私有数据?为什么同一类的对象可以访问彼此的私有数据?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 ++中的访问控制意味着在每个类的基础上工作。
Smart猫小萌
TA贡献1911条经验 获得超7个赞
这是一个很好的问题,我最近遇到过这个问题。我与同事们进行了一些讨论,这是我们讨论的总结:这是设计的。这并不意味着这种设计对于所有情况都是完全合理的,但必须考虑为什么选择每个类私有。我们可以想到的可能原因包括:
首先,每个实例访问控制的成本可能非常高。这个帖子中的其他人已经讨论过这个问题。理论上,这可以通过此指针检查来完成。但是,这不能在编译时完成,并且只能在运行时完成。因此,您必须在运行时识别每个成员的访问控制,并且当它被违反时,可能只会引发异常。成本很高。
其次,每个类访问控制都有自己的用例,比如copy constructor或operator =。如果每个实例都有访问控制,那么很难实现它们。
此外,访问控制主要来自编程/语言角度,用于如何模块化/控制对代码/成员的访问,而不是数据
- 3 回答
- 0 关注
- 490 浏览
添加回答
举报
0/150
提交
取消