C++的友元類和友元函數實例


 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。友元不是成員函數,但是它可以訪問類中的私有成員。友元的 作用在於提高程序的運行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私有成員。

友元函數的特點是能夠訪問類中的私有成員的非成員函數。友元函數從語法上看,它與普通函數一樣,即在定義上和調用上與普通函數一樣.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM