我們都知道類別中的私有成員,只有被類別裡的成員函數訪問,在類別外是不能訪問的。這體現了C++中類別設計的封裝、隱藏思想,是C++最基本的優點。
但如果偶爾有的時候,我們在類外又確實想訪問這些私有成員,就會變得麻煩很多,就處於既訪問不到又不能聲明為public類型的兩難處境。
而友元的出現就可以很好的解決這個問題,也就是把外部的函數宣告為友元類型,賦予它可以存取類內私有成員的權利,來做到兩全其美。這就是友元的意義,從字面意思也可以看出來,像「朋友」一樣,開了一個綠色通道。
友元的對象,它可以是全域的一般函數,也可以是其他類別裡的成員函數,這種叫做友元函數。不僅如此,友元還可以是一個類,這種叫做友元類。
在理解友元的意義和作用後,我們來看怎麼在C++中使用。對於友元函數,只需要在類別內對這個函數進行聲明,並在之前加上friend關鍵字。這個函數就具有了獨特的權限,成為友元函數。
最後要注意的是,友元並不屬於這個類別本身,無論是友元函數還是友元類別。都不能使用類別內的this指針,同時也不可以被繼承,如同父親的朋友不一定是兒子的朋友這個道理。
下面,我們寫一個求兩點之間距離的程式:
#include<iostream>#include<math.h>usingnamespacestd;classPoint{private:doublex;doubley;public:Point(doublea,doubleb){x=a;y=b;}intGetPoint(){cout<<(<< x<<,<<y<<);return0;}frienddoubleDistance(Point&a,Point&b);};//求兩點之間的距離doubleDistance(Point&a,Point&b){doublexx;doubleyy;xx=ax-bx;yyyax =ay-by;returnsqrt(xx*xx+yy*yy);}intmain(){PointA(2.0,3.0);PointB(1.0,2.0);doubledis;dis=Distance(A,B);cout<<disdis <<endl;return0;}
大家可以觀察實作求兩點之間距離的函數為外部的一般函數,由於需要存取類別內的私有成員,所以我們把它在類別內宣告成frined友元類型,請參閱Point類別內的最後一行。此時程式碼編譯無問題,正常輸出:
可以看到測試結果,大家可以上機自行實驗,分別嘗試不聲明為friend類型,觀察報錯結果。