友元(friend)
問題的提出
咱們已知道類具備封裝和信息隱藏的特性。只有類的成員函數才能訪問類的私有成員,程序中的其餘函數是沒法訪問私有成員的。非成員函數能夠訪問類中的公有成員,可是若是將數據成員都定義爲公有的,這又破壞了隱藏的特性。另外,應該看到在某些狀況下,特別是在對某些成員函數屢次調用時,因爲參數傳遞,類型檢查和安全性檢查等都須要時間開銷,而影響程序的運行效率。
爲了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函數,但它須要在類體內進行說明,爲了與該類的成員函數加以區別,在說明時前面加以關鍵字friend。友元不是成員函數,可是它能夠訪問類中的私有成員。友元的做用在於提升程序的運行效率,可是,它破壞了類的封裝性和隱藏性,使得非成員函數能夠訪問類的私有成員。
友元能夠是一個函數,該函數被稱爲友元函數;友元也能夠是一個類,該類被稱爲友元類。
友元函數
友元函數的特色是可以訪問類中的私有成員的非成員函數。友元函數從語法上看,它與普通函數同樣,即在定義上和調用上與普通函數同樣。下面舉一例子說明友元函數的應用。c++
#include #include class Point { public: Point(double xx, double yy) { x=xx; y=yy; } void Getxy(); friend double Distance(Point &a, Point &b); private: double x, y; }; void Point::Getxy() { cout<<"("< } double Distance(Point &a, Point &b) { double dx = a.x - b.x; double dy = a.y - b.y; return sqrt(dx*dx+dy*dy); } void main() { Point p1(3.0, 4.0), p2(6.0, 8.0); p1.Getxy(); p2.Getxy(); double d = Distance(p1, p2); cout<<"Distance is"< }
說明:在該程序中的Point類中說明了一個友元函數Distance(),它在說明時前邊加friend關鍵字,標識它不是成員函數,而是友元函數。它的定義方法與普通函數定義同樣,而不一樣於成員函數的定義,由於它不須要指出所屬的類。可是,它能夠引用類中的私有成員,函數體中a.x,b.x,a.y,b.y都是類的私有成員,它們是經過對象引用的。在調用友元函數時,也是同普通函數的調用同樣,不要像成員函數那樣調用。本例中,p1.Getxy()和p2.Getxy()這是成員函數的調用,要用對象來表示。而Distance(p1, p2)是友元函數的調用,它直接調用,不須要對象表示,它的參數是對象。(該程序的功能是已知兩點座標,求出兩點的距離。)windows