在介紹類和對象時,已經說過類具有封裝性,類中的私有成員一般只有通過該類中的成員函數才可以訪問,而程序中的其他函數時無法直接訪問類中的私有成員的。如果在一定的條件下需要訪問類的私有成員,就必須通過對象來調用類的成員函數,但是頻繁的調用會非常的繁瑣,也會降低程序的運行效率。為了解決這個問題,有了友元函數這個幫手,但是引進它,也破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私有成員,一般不建議使用友元函數。
友元函數
友元函數的特點:
1,說明在類體內,說明時,在函數的類型說明符前加關鍵字friend。
2,定義在類體外時,定義格式和一般的普通函數相同,為:<類型說明符> <函數名> ( <參數表> )
3,友元函數時非成員函數,在調用上與普通函數相同。
4,友元函數可以直接訪問類中的私有成員。
舉例編程求兩個double型數的點之間的距離:
#include//頭文件命令 #include //數學庫函數包含文件 class Point { public: Point(double i,double j)//定義的帶兩個參數的構造函數 { x=i; y=j; } void Getxy()//一般的成員函數 { cout<<"("< 程序的分析:
1,通過調用構造函數來對類的對象進行初始化,使得兩個對象的參數得到數值。
2,通過對象調用成員函數來輸出坐標。
3,通過調用友元函數來輸出兩個點之間的距離。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICAgICDT0dSqwOA8L3A+CjxwPiAgICAgICDT0dSqwODKx7DR0ru49sDgtbGzycHt0ru49sDgtcTT0dSqoaO1sdK7uPbA4Nf3zqrB7dK7uPbA4LXE09HUqsqxo6zT0dSqwODW0LXEy/nT0LPJ1LG6r8r9trzKx8Ht0ru49sDgtcTT0dSquq/K/aGjPC9wPgo8cD4gICAgICAg09HUqrqvyv22qNLlJiMyNjY4NDvKvaO6ZnJpZW5kICBjbGFzcyAgPMDgw/s+PC9wPgo8cD4gICAgICAgvtnA/bHgs8zKtc/W09HUqsDgtcTKudPDPC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">#include
//頭文件包含命令 class A//定義的類A { public: friend class B;//定義的友元類B void Set(int i) { x=i; }//一般的成員函數 void Display() { cout<<"x="< 程序分析: 1,通過調用成員函數來賦值給x,靜態數據成員的值為10,因此輸出x=5,y=10
2,通過調用構造函數來給類B的對象的成員進行賦值,然後再調用成員函數來輸出x=6,y=9
3,在進行第二次的輸出時,靜態數據成員被更新成9,因此輸出x=5,y=9
漏洞。