重點:常用于定義兩個類之間的運算,比如重載+運算符,實現兩個類相加等。目的是隱藏內部機理,強調了實質。
例如通過運算符重載實現兩個Time類的相加,函數聲明為:
Time Operator+(const Time & t) const;
定義函數頭為:
Time Time::operator+(const Time & t) const
把operator+看作成員函數名,可以用函數表示法如下調用:
total = a.operator+(b);
可以使用運算符表示法,更為直觀:
total = a + b;
需要注意,在運算符表示法中,運算符左側的對象是調用對象,右邊的對象是作為參數被傳遞的對象。
由于+是從左向右結合的運算符,還能這么用:
total = a + b + c;
其相當于:
total = a.operator+(b.operator+(c));
運算符重載的限制:
重載后的運算符必需至少有一個操作數是用戶定義的類型,可以防止用戶為標準類型重載與運算符;不能違反運算符原來的句法規則;不能修改運算符優先級;不能創建新的運算符。
友元:公有類提供唯一訪問私有成員數據的途徑,但這種限制太嚴格。于是C++提供了友元機制,包括:
友元函數;友元類;友元成員函數。
友元函數即賦予該函數與類的成員函數相同的訪問權限。
重載二元運算符時常常需要友元,能避免左邊的操作數必須是類對象的限制,例如數乘。采用非成員函數重載運算符,左邊的操作數對應于第一個參數,右邊的操作數對應于第二個參數,同時又能因為友元函數而訪問類的私有成員。
A = 2.75 * B;
相當于調用:
A = operator*(2.75,B);
其原型:
friend Time operator*(double m, const Time & t);//雖在類聲明中聲明,但不是成員函數,然而卻與成員函數訪問權限相同。另外由于不是成員函數,在類實現定義文件cpp中不要使用Time::等限定符,且不要使用friend。
友元并不違背面向對象,類聲明仍然控制了哪些函數可以訪問私有數據,應將友元函數看作類的擴展接口的組成部分,類方法和友元只是表達類接口的兩種不同機制。
另外,友元在重載<<運算符中也起重要作用。想用cout<<trip;直觀地實現輸出,如果采用成員函數重載運算符,則左邊的操作數必須是Time類對象,只能這么用:trip<<cout;太不直觀。因此使用友元,同時返回ostream對象的引用可以繼承連續<<輸出的特點。
std::ostream & operator<<(std::ostream & os, const Time & t)
{
os << ..;
return os;
}
記得聲明的原型中要加friend關鍵字。
非成員版本的重載運算符函數所需的形參數目與運算符使用的操作數數目相同,而成員函數版本所需的參數數目少一個,因為其中的一個操作數是被隱式地傳遞的調用對象。
新聞熱點
疑難解答
圖片精選