friend 返回值型別 函數名(參數列);
將其他類的成員函數宣告為友元的寫法如下:friend 返回值型別 其他類的類名::成員函數名(參數列);
但是,不能把其他類的私有成員函數宣告為友元。#include<iostream> using namespace std; class CCar; //提前宣告CCar類,以便後面的CDriver類使用 class CDriver { public: void ModifyCar(CCar* pCar); //改裝汽車 }; class CCar { private: int price; friend int MostExpensiveCar(CCar cars[], int total); //宣告友元 friend void CDriver::ModifyCar(CCar* pCar); //宣告友元 }; void CDriver::ModifyCar(CCar* pCar) { pCar->price += 1000; //汽車改裝後價值增加 } int MostExpensiveCar(CCar cars[], int total) //求最貴氣車的價格 { int tmpMax = -1; for (int i = 0; i<total; ++i) if (cars[i].price > tmpMax) tmpMax = cars[i].price; return tmpMax; } int main() { return 0; }這個程式只是為了展示友元的用法,所以 main 函數什麼也不做。
class 類名;
儘管可以提前宣告,但是在一個類的定義出現之前,仍然不能有任何會導致該類物件被生成的語句。但使用該類的指標或參照是沒有問題的。friend class 類名;
來看如下例程:class CCar { private: int price; friend class CDriver; //宣告 CDriver 為友元類 }; class CDriver { public: CCar myCar; void ModifyCar() //改裝汽車 { myCar.price += 1000; //因CDriver是CCar的友元類,故此處可以存取其私有成員 } }; int main() { return 0; }第 5 行將 CDriver 宣告為 CCar 的友元類。這條語句本來就是在宣告 CDriver 是一個類,所以 CCar 類定義前面就不用宣告 CDriver 類了。第 5 行使得 CDriver 類的所有成員函數都能存取 CCar 物件的私有成員。如果沒有第 5 行,第 13 行對 myCar 私有成員 price 的存取就會導致編譯錯誤。