標籤:c++
1.是什嗎?
友元機制允許一個類將對其非公有成員的訪問權授予制定的函數或類。 ——《c++ primer》
2.為什麼要提出?:
類中一些成員函數使用較為頻繁,需要大量時間開銷,為了減少時間開銷,就允許破壞程式的封裝性,使用一個外部函數或類可以訪問該類中的私人成員。所以友元的作用在於提高程式的運行效率(即減少了類型檢查和安全性檢查等都需要的時間開銷)。
3.友元的問題:
友元的使用破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私人成員。
4.友元的曆史:
友元的產生是由於最初電腦的運行速度沒有現在快,而C++語言講的就是速度,為瞭解決其它類方便訪問類的私人變數或者說是私人成員函數,故就使用了友元這個機制,但是現在的電腦速度的提高,友元所產生的作用也漸漸地看不出效果來了,但是C++標準沒有把友元取消.
5.友元使用的注意點:
友元有點突破了物件導向思想的封裝性,能少用就少用。
下面說一下什麼時候使用友元函數和友元類,其實二者沒有太大的區別,如果只是一般函數訪問類的私人成員或者說是私人資料成員,使用友元函數就可以了,如果是使用類來訪問其它類的私人資料成員和私人成員函數就使用友元類.
友元的聲明以關鍵字friend開始,只能出現在類定義的內部,友元聲明可以出現在類中任何地方,友元不是授予友元關係的那個類的成員,所以他們不受其聲明出現部分的存取控制影響。通常最好放在類定義的開始或結尾。
給個例子:
(1) For class Point(點), define two functions to implement the same capability—calculate the distance between two points. One function is defined as member function of Point (named distance_2), the other is defined as friend function (named distance_1). Complete the definition of class Point to make the program run successfully. Keep the output in your document.
#include <iostream>#include <cmath>using namespace std;class Point { friend double distance_1(Point&,Point&);public: Point( double xx = 0.0, double yy = 0.0 ) { x = xx; y = yy; } double getX() { return x; } double getY() { return y; } double distance_2 ( Point &);private: double x,y;};double distance_1 ( Point & a, Point &b){ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));}double Point::distance_2 ( Point & p){ return sqrt(pow(x-p.x,2)+pow(y-p.y,2));}int main(){ Point p1(3, 5), p2(4, 6); double result1 = distance_1(p1, p2); double result2 = p1.distance_2(p2); cout << "The distance is " << result1 << ‘\t‘<< result2 << endl; return 0;}
這裡分別使用成員函數和友元函數對兩點之間的距離進行了計算。這裡需要注意的是這裡只有distance_1可以聲明為友元函數,而distance_2不能聲明為友元函數。因為distance_2隻有一個參數,並且友元函數不是成員函數,不能對一個參數進行距離計算
C++ 友元的一點總結