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