国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++運算符重載及友元函數

2019-11-11 03:59:49
字體:
來源:轉載
供稿:網友

重點:常用于定義兩個類之間的運算,比如重載+運算符,實現兩個類相加等。目的是隱藏內部機理,強調了實質。

例如通過運算符重載實現兩個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關鍵字。

非成員版本的重載運算符函數所需的形參數目與運算符使用的操作數數目相同,而成員函數版本所需的參數數目少一個,因為其中的一個操作數是被隱式地傳遞的調用對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 涟源市| 南木林县| 靖远县| 康乐县| 马公市| 正宁县| 神池县| 凤阳县| 电白县| 翁源县| 沾益县| 榕江县| 湛江市| 荃湾区| 当涂县| 阳曲县| 阳信县| 绥芬河市| 元氏县| 莒南县| 大厂| 精河县| 奉化市| 大英县| 沾益县| 峨边| 麦盖提县| 河北省| 天水市| 布拖县| 保山市| 嫩江县| 承德市| 武威市| 赣州市| 光泽县| 淅川县| 铜鼓县| 陕西省| 浦县| 壤塘县|