標籤:

c++為什麼要將同一個類的對象定義互為friend?

我重載運算符時發現傳進來的對象可以直接訪問它的私有成員變數,看侯捷的視頻他說同一個類的對象是互為friend的,想不通c++的設計者為什麼要這樣設計,不會破壞封裝嗎


建議你看看一篇古老的文章叫How Non-Member Functions Improve Encapsulation,作者Scott Meyers。裡面定義了「封裝度」的概念,也指明了如何計算封裝度。遇到類似情況的時候你可以套用這個來看是否破壞封裝。

另一方面,C++並沒有把同一個類的對象定義互為friend。而是封裝許可權是在class級別,而不是對象級別。所以並不存在互為friend的情況。


就像開源軟體的license一樣,只有對使用者才有破壞封裝一說,自己對自己怎麼干都不叫破壞封裝。


不認同這個觀點,因為private/protected/public也好,friend也好,都是作用在類層面,而不是作用在一個具體的對象上的。

我們說的都是友元類,友元函數,沒有說友元對象的。

面向對象本來就是劃分成若干類對象,給「每一類」做設計。

如果要精確到給每一個對象做設計……

得加錢,加好多好多的錢。


請參見問題:

C++允許「我們都是人,所以我可以把你私有的眼睛借來隨便玩,再還給你」,這難道是一種設計上的妥協? - 知乎


又想自己使用方便

又想保持封裝的特性

那隻能在不影響封裝的原則上打洞嘍

同一個類的對象默認互為友元也是為了方便呀

有類Man

Man m2=m1 合法

Man m2(m1) 合法

若不是互為友元賦值還真不方便


或許可以這樣子理解:編譯器把封裝的許可權設在了class級別,而能夠訪問該類的許可權的類通通放在一個列表中,其中包括類本身、友元類,所以把類本身稱為自己的友元也算合理,但並不能說對象是友元,友元是相對與類來說的


友元就是來破壞封裝的 (逃


令你可以把特殊情況下的關係和結構描述。否則描述不了就是一種限制。問題是,程序員修為要有多高才能發現這些關係和結構。


我不太認可這種表述,即便是C#/java這種沒有friend概念的語言,也可以訪問同一個類其他對象的private成員。

從設計上講,同一個類的對象本身就是強耦合關係,加上這種限制以後就會礙手礙腳。


朋元(friend)就是一種破壞封裝的一種設計,C艹課本上應該都有明確指出啊(?_?)


OO 的對象邊界原則已經阻止了編程的靈活性,所以 C++ 只好走 function 的中庸了。OO 本身就是愚蠢,直到你的程序到達那個複雜的階段,你就會明白這個含義。

friend 本身的目的是期望對象可以重載/多態未知的(未來的)數據對象。

A.send(T) 用戶可以定義新的數據對象,並且用 friend 綁定自己的數據對象和 A,這樣就可以 A.send(新的數據對象)


推薦閱讀:

C++ 是否適合做 GUI?
std::vector會在不同dll中傳遞修改時帶來影響嗎?
在 64 位平台開發時是否應盡量避免使用指針?
長期用 C++ 和 MATLAB 做機器學習的你,有沒有遇到一個讓你相見恨晚的語言或包?
OpenMP在實際開發中應用多嗎?

TAG:CC |