為什么同一類的對象可以訪問彼此的私有數據?為什么同一類的對象可以訪問彼此的私有數據?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條經驗 獲得超8個贊
因為這就是它在C ++中的工作方式。在C ++中,訪問控制基于每個類而不是基于每個對象。
C ++中的訪問控制是作為靜態編譯時功能實現的。我認為很明顯,在編譯時實際上不可能實現任何有意義的每對象訪問控制。只有每類控制才能實現。
受保護的訪問規范中存在一些每對象控制的提示,這就是為什么它甚至在標準中有自己的專用章節(11.5)。但是,那里描述的任何每個對象的特征仍然相當簡陋。同樣,C ++中的訪問控制意味著在每個類的基礎上工作。

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
這是一個很好的問題,我最近遇到過這個問題。我與同事們進行了一些討論,這是我們討論的總結:這是設計的。這并不意味著這種設計對于所有情況都是完全合理的,但必須考慮為什么選擇每個類私有。我們可以想到的可能原因包括:
首先,每個實例訪問控制的成本可能非常高。這個帖子中的其他人已經討論過這個問題。理論上,這可以通過此指針檢查來完成。但是,這不能在編譯時完成,并且只能在運行時完成。因此,您必須在運行時識別每個成員的訪問控制,并且當它被違反時,可能只會引發異常。成本很高。
其次,每個類訪問控制都有自己的用例,比如copy constructor或operator =。如果每個實例都有訪問控制,那么很難實現它們。
此外,訪問控制主要來自編程/語言角度,用于如何模塊化/控制對代碼/成員的訪問,而不是數據
- 3 回答
- 0 關注
- 529 瀏覽
添加回答
舉報
0/150
提交
取消