友元函式通過類的物件可以訪問類的公有、保護和私有成員,也就是類的所有成員友元函式都能訪問到
。所以運算子過載為類的友元函式以後也可以訪問類的所有成員。
與運算子過載為成員函式時不同的是,過載的友元函式不屬於任何類
,運算子的運算元都需要通過函式的形參表傳遞
。運算元在形參表中從左到右出現的順序就是用運算子寫表示式時運算元的順序。
這裡也分雙目運算子和單目運算子兩種情況討論運算子過載為友元函式的具體方式。
如果有雙目運算子
u,它的其中乙個運算元是類a的物件a,那麼運算子u就可以過載為類a的友元函式,此友元函式的兩個引數中,乙個是類a的物件,另乙個是其他物件,也可以是類a的物件。這樣雙目運算子過載為類的友元函式後,假設運算子的兩乙個運算元是物件b,則
表示式a u b就相當於呼叫函式operator u(a, b)。
下面再討論單目運算子的過載。如果有前置單目運算子u,比如前置「--」,a為類a的物件,我們想實現u a這樣的運算,就可以把u過載為類a的友元函式,此友元函式只有乙個形參,為類a的物件,
過載後表示式u a相當於呼叫函式operator u(a)
。如果是後置單目運算子u,如後置「++」,a還是類a的物件,那麼要實現a u這樣的運算,也可以把u過載為類a的友元函式,此時友元函式就需要有兩個形參,乙個是類a的物件,另乙個是整型形參,
此整型形參沒有實際意義,與前面後置單目運算子過載為成員函式時的整型形參一樣,
只是為了區分前置運算子和後置運算子的過載
。過載後表示式a u就相當於呼叫函式operator u(a, 0)。
將前面第乙個例子中的運算子過載改為友元函式,再簡單介紹下要實現的功能:時間值的加法,比如2個小時20分鐘加3個小時30分鐘,應該是5個小時50分鐘,運算規則就是小時數相加,分鐘數相加,如果分鐘數的和超過60分鐘則小時數再加1,分鐘數減60。雙目運算子「+」需要過載為時間值類的友元函式,
此函式有兩個形參,型別都是時間值類的物件。
#include
using namespace
std;
class ctimespan
// 獲取小時數
int getmins() // 獲取分鐘數
void show(); // 顯示時間值
private:
int m_nhours; // 小時數
int m_nmins; // 分鐘數
};ctimespan::ctimespan(int nhours, int nmins) // 建構函式的實現
void ctimespan::show()
ctimespan operator +(ctimespan ts1, ctimespan ts2) // 過載運算子
函式實現
int main()
程式執行結果:
timespan1: 2小時50分鐘
timespan2: 3小時30分鐘
timesum=timespan1+timespan2: 6小時20分鐘
這個程式的主函式
main與前面例子的main函式完全相同,程式執行結果也一樣。區別就是加法運算子過載為ctimespan類的友元函式而不是成員函式,我們看到運算子過載函式有兩個形參ts1和ts2,通過這兩個引數將需要進行運算的運算元傳遞進去,而
在此函式中也能夠訪問類ctimespan的私有成員m_nhours和m_nmins。
運算子過載為友元函式
運算子過載為友元函式 郭 煒 劉家瑛 frend function.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std class complexs complexs void print friend complexs op...
運算子過載,友元函式
運算子過載 include using namespace std class cint cint const cint timp public cint operator const cint timp const cint add const cint timp const cint add c...
13 運算子過載為友元
1.一般情況下,將運算子過載為類的成員函式,是較好的選擇。2.但有時,過載為成員函式不能滿足使用要求,過載為普通函式,又不能訪問私有成員,所以需要將運算子過載為友元。class complex complex operator double r complex complex operator do...