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 |
