技術(shù)交流QQ群:1027579432,歡迎你的加入!
1.C++中的友元函數(shù)
- 類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員。盡管友元函數(shù)的原型有在類的定義中出現(xiàn)過(guò),但是友元函數(shù)并不是成員函數(shù)。友元可以是一個(gè)函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個(gè)類,該類被稱為友元類,在這種情況下,整個(gè)類及其所有成員都是友元。
- 如果要聲明函數(shù)為一個(gè)類的友元,需要在類定義中該函數(shù)原型前使用關(guān)鍵字friend,如下所示:
class Box{ double width; // 默認(rèn)是private public: double length; friend void printWidth(Box box); // 友元函數(shù)聲明 void setWidth(double wid); }; - 聲明類 ClassTwo 的所有成員函數(shù)作為類 ClassOne 的友元,需要在類 ClassOne 的定義中放置如下聲明:
friend class classTwo; // 在classOne類中進(jìn)行此友元類的聲明?。?! - 完整友元函數(shù)的實(shí)例如下:
#include "iostream" using namespace std; class Box{ double width; // 默認(rèn)是private public: double length; friend void printWidth(Box box); // 友元函數(shù)聲明 void setWidth(double wid); }; // 成員函數(shù)的定義 void Box::setWidth(double wid){ width = wid; } // 友元函數(shù)的定義 // 請(qǐng)注意:printWidth() 不是任何類的成員函數(shù)!!! void printWidth(Box box){ cout << "Width of Box: " << box.width << endl; } int main(){ Box box; // 使用成員函數(shù)設(shè)置寬度 box.setWidth(10.0); // 使用友元函數(shù)輸出寬度 printWidth(box); // 調(diào)用友元函數(shù)! cout << "-------------------------------------\n"; return 0; }
2.友元函數(shù)的使用
-
可以直接調(diào)用友元函數(shù),不需要通過(guò)對(duì)象或指針;此外,友元函數(shù)沒(méi)有this指針,則參數(shù)要有三種情況:
- 要訪問(wèn)非static成員時(shí),需要對(duì)象做參數(shù);
- 要訪問(wèn)static成員或全局變量時(shí),則不需要對(duì)象做參數(shù);
- 如果做參數(shù)的對(duì)象是全局對(duì)象,則不需要對(duì)象做參數(shù).
class INT{ friend void Print(const INT& obj); // 聲明友元函數(shù) }; // 友元函數(shù)的定義 void Print(const INT& obj){ cout << "我是INT類的友元函數(shù),我驕傲!\n"; } INT obj; Print(obj); // 直接調(diào)用友元函數(shù),不需要使用對(duì)象或者指針! - 下面實(shí)例是友元類的使用,詳細(xì)見(jiàn)下面的實(shí)例:
class Box{ double width; // 默認(rèn)是private public: double length; friend void printWidth(Box box); // 友元函數(shù)聲明 friend class BigBox; // 友元類的聲明 void setWidth(double wid); }; // 成員函數(shù)的定義 void Box::setWidth(double wid){ width = wid; } // 友元函數(shù)的定義 // 請(qǐng)注意:printWidth() 不是任何類的成員函數(shù)!!! void printWidth(Box box){ /* 因?yàn)閜rintWidth()是Box的友元函數(shù),它可以直接訪問(wèn)該類的任何成員 */ cout << "Width of Box: " << box.width << endl; } // 友元類的使用 class BigBox{ public: void Print(int width, Box &box){ // BigBox是Box類的友元類,它可以直接訪問(wèn)Box類的任何成員 box.setWidth(width); cout << "Width of Box: " << box.width << endl; } }; int main(){ Box box; BigBox big; // 使用成員函數(shù)設(shè)置寬度 box.setWidth(10.0); // 使用友元函數(shù)輸出寬度 printWidth(box); // 調(diào)用友元函數(shù)! cout << "-------------------------------------\n"; // 使用友元類中的方法設(shè)置寬度 big.Print(20, box); return 0; }