1 #include <math.h> 2 #include<iostream> 3 using namespace std; 4 5 class Point 6 { 7 public: 8 Point(double xx, double yy) 9 { 10 x=xx; 11 y=yy; 12 } 13 void Getxy(); 14 friend double Distance(Point &a, Point &b); //類Point的友元函數 15 friend class You; //類Point的友元類 16 private: 17 double x, y; 18 }; 19 20 21 class You 22 { 23 public: 24 double Multi(Point &a) 25 { 26 return a.x * a.y + 1; 27 } 28 }; 32 void Point::Getxy() 33 { 34 cout<<"("<<x<<","<<y<<")"<<endl; 35 } 36 double Distance(Point &a, Point &b) //類Point的友元函數 37 { 38 double dx = a.x - b.x; 39 double dy = a.y - b.y; 40 return sqrt(dx*dx+dy*dy); 41 } 42 int main(void) 43 { 44 Point p1(3.0, 4.0), p2(6.0, 8.0); 45 p1.Getxy(); 46 p2.Getxy(); 47 double d = Distance(p1, p2); //Distance是類Point的友元函數,不是成員函數 48 cout<<"Distance is "<<d<<endl; 49 You you; 50 d = you.Multi(p1); 51 cout<<"Math.Multi is "<<d<<endl; 52 return true; 53 }
為什么會有友元函數?
結合着類的特性和類中一般成員函數,我們可以這樣理解:類具有封裝和信息隱藏的特性。只有類的成員函數才能訪問類的私有 成員,程序中的其他函數是無法訪問私有成員的。非成員函數可以訪問類中的公有成員,但是如果將數據成員都定義為公有的,這又破壞了隱藏的特性。另外,應該 看到在某些情況下,特別是在對某些成員函數多次調用時,由於參數傳遞,類型檢查和安全性檢查等都需要時間開銷,而影響程序的運行效率。
為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函數,但 它需要在類體內進行說明,為了與該類的成員函數加以區別,在說明時前面加以關鍵字friend。友元不是成員函數,但是它可以訪問類中的私有成員。友元的 作用在於提高程序的運行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私有成員。
友元函數的特點是能夠訪問類中的私有成員的非成員函數。友元函數從語法上看,它與普通函數一樣,即在定義上和調用上與普通函數一樣.