1. 程式人生 > >為什麼要引入友元機制

為什麼要引入友元機制

【一】為什麼引入友元機制?     總的來說就是為了讓非成員函式即普通函式或其他類可以訪問類的私有成員,這確實破壞了類的封裝性和資料的隱蔽性,但為什麼要這麼做呢? c++ primer:儘管友元被授予從外部訪問類的私有部分的許可權,但它並不與面向物件的程式設計思想相悖,相反,他們提高了公有介面的靈活性)。 要理解上面這句話,就必須知道友元形成的過程:(任何函式,或者成員函式或者類想成為某個類的友元,這是由這個類來決定的,而不能從外部強加友情     下面來看不引進友元的缺點: (1)資料的封裝是把雙刃劍,只要資料被封裝,類外的函式就無法訪問到類內的私有成員函式,但有些情況下,我們必須要訪問某一些類的私有成員,我們就會為了這一些特殊的少部分訪問操作要把資料成員公有化,即為了滿足少量人的需求而把資料置於公共的不安全的狀態下,這顯然是不明智的,同理,在公共介面中放置一些可以訪問私有成員的函式作為介面讓其他外部函式進行訪問,這樣做也就把私有成員通過自己的公有介面暴漏,不可取,這種在資料的安全性和共享性的博弈中
,沒有兩全其美的方案,所以就產生了友元這種機制,即儘可能的對資料進行封裝,有特殊要求就特殊對待,即對某些類外的函式“開後門”,對那些函式開後門由類說了算,這正是提高公共介面的靈活性的體現。
【二】友元函式的形態 友元主要分為友元函式友元類,在電視機和遙控器的例子中,電視機和遙控器都可以控制電視(換臺,調節音量,切換模式等),但電視機和遙控器不是派生繼承的關係,為了複用和控制電視機,就可以把遙控器類宣告為電視機的友元類,這樣遙控器類中的所有函式就可以使用電視機類中的所有成員,包括複用電視機中的所有操作,但是發現除了頻道這個電視機的私有成員,其他的私有成員在電視機的公共介面中都可以訪問,那麼,就沒必要吧整個遙控器類宣告為友元類,只要把直接操作頻道的這個函式宣告為電視機的友元函式即可。     【友元函式】
在類內部,只能申明函式原型,不能定義函式體,不是訪問級別的限制。     【友元類】友類的每個成員都可以訪問另一個類中的保護成員和私有成員。    注意:呼叫私有成員需要制定物件,即:物件名.變數。

成員函式有this指標,而友元函式沒有this指標。

               友元函式是不能被繼承的,就像父親的朋友未必是兒子的朋友。


【三】運算子過載     先來看看普通的運算子過載:
#include<iostream> using namespace std; class add { public:     add(int);     int operator +(add);//過載運算子
private:     int a; }; add::add(int x) {     a = x; } int add::operator +(add tem) {     return a - tem.a; } int main() {     add t1(10),t2(20);     cout << "t1+t2=" << t1 + t2 << endl;     system("pause"); }