我們都知道類中的私有成員,只有被類里的成員函數(shù)訪問,在類外是不能訪問的。這體現(xiàn)了C++中類設計的封裝、隱蔽思想,是C++最基本的優(yōu)點。
但如果偶爾有的時候,我們在類外又確實想訪問這些私有成員,就會變得麻煩很多,就處于既訪問不到又不能聲明為public類型的兩難處境。
而友元的出現(xiàn)就可以很好的解決這個問題,即把外部的函數(shù)聲明為友元類型,賦予它可以訪問類內(nèi)私有成員的權利,來做到兩全其美。這就是友元的意義,從字面意思也可以看出來,像“朋友”一樣,開了一個綠色通道。
友元的對象,它可以是全局的一般函數(shù),也可以是其他類里的成員函數(shù),這種叫做友元函數(shù)。不僅如此,友元還可以是一個類,這種叫做友元類。
理解友元的意義和作用后,我們來看怎么在C++中使用。對于友元函數(shù),只需要在類內(nèi)對這個函數(shù)進行聲明,并在之前加上friend關鍵字。這個函數(shù)就具有了獨特的權限,成為友元函數(shù)。
最后需要注意的是,友元并不屬于這個類本身,無論是友元函數(shù)還是友元類。都不能使用類內(nèi)的this指針,同時也不可以被繼承,如同父親的朋友不一定是兒子的朋友這個道理。
下面,我們寫一個求兩點之間距離的程序:
#include<iostream> #include<math.h> using namespace std; class Point { private: double x; double y; public: Point(double a,double b) { x = a; y = b; } int GetPoint() { cout<<"("<<x<<","<<y<<")"; return 0; } friend double Distance(Point &a,Point &b); }; //求兩點之間的距離 double Distance(Point &a,Point &b) { double xx; double yy; xx = a.x-b.x; yy = a.y-b.y; return sqrt(xx*xx+yy*yy); } int main() { Point A(2.0,3.0); Point B(1.0,2.0); double dis; dis = Distance(A,B); cout<<dis<<endl; return 0; }
大家可以觀察實現(xiàn)求兩點之間距離的函數(shù)為外部的一般函數(shù),由于需要訪問類內(nèi)的私有成員,所以我們把它在類內(nèi)聲明成frined友元類型,見Point類內(nèi)的最后一行。此時代碼編譯無問題,正常輸出:
可以看到測試結果,大家可以上機自行實驗,分別嘗試不聲明為friend類型,觀察報錯結果。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程