假設trip是乙個time物件。為顯示time的值,可以使用show()函式,然而,如果可以像下面這樣操作更好:
cout<< trip;
//make cout recognize time class?
解釋
<< 是可以被過載的c++運算子之一。
cout是乙個 ostream 物件,它是智慧型的,能夠識別所有的c++ 基本型別。這是因為對於每種基本型別,ostream 類宣告中都包含了相應的過載的operator<<() 定義。
因此,要使cout 能夠識別time物件,一種方法是將乙個新的函式運算子新增到 ostream 類的宣告中。
但修改 iostream 檔案不安全,這樣做會在標準介面上浪費時間。相反,通過time 類宣告來讓 time 類知道如何使用cout 。
要使time 類物件知道使用 cout ,必須使用友元函式。這是什麼原因呢?因為下面這樣的語句使用兩個物件,第乙個是 ostream類物件(cout) :
cout << trip;
如果使用乙個time成員函式來過載<<,time物件將是第乙個運算元,就像使用成員函式過載 * 運算子那樣。這意味著必須這樣使用:
trip << cout ;
// if operator<<() were a time member function
這樣會令人迷惑。但通過使用友元函式,可以像下面這樣過載運算子:
void
operator
<<
(ostream &os ,
const time &t)
這樣可以使用下面的語句:
cout << trip;
列印結果:
4 hours,23 minutes
前面介紹的實現存在乙個問題,像下面這樣的語句可以正常工作:
cout << trip ;
但這種實現不允許像通常那樣將重新定義的 << 運算子與cout 一起使用:
cout <<
"trip time: "
<< trip <<
" (tuesdays)\n"
;//can't do
小知識點
以上不可行原因
int x =5;
int y =8;
cout << x << y;
// cout 從做到右輸出語句,意味著它等同於:(cout << x) << y;
正如 iostream 中定義的那樣 ,<< 運算子左邊必須是乙個 ostream 物件。
ostream 類將 operator<<() 函式實現為返回乙個指向 ostream 物件的引用。具體的說,它返回乙個指向呼叫物件(這裡是cout)的引用。
因此,表示式(cout << x)本身就是 ostream物件cout ,從而可以位於 << 運算子的右側 。
可以對友元函式採用相同的方法。只要修改 operator<<() 函式, 讓它返回 ostream 物件的引用即可:
ostream &
operator
<<
(ostream & os ,
const time &t)
有元過載C 輸入輸出操作符(上篇)
1.一般來說c 標準型別的資料不需要過載 2.使用者自己定義的型別的資料,如我們在c 裡面最常使用的類,如果在類中要使用是不能直接用 和 來輸出和輸入的。如果想用它們輸出和輸入自己宣告的型別的資料,必須對它們過載。過載輸出操作符 操作符的過載有兩種版本,詳細解釋見下篇 此處說明第二種版本使用 為了與...
友元及操作符過載
友元 c 控制類物件私有部分的訪問,但有時候需要在類的外部訪問類的私有成員,這種情況下 c 提供了友元機制。友元函式,友元類 宣告為某一類 class 1 的友元函式 test 或則友元類 class 2 後,在 test 或則 class 2 中可以訪問 class 1 的私有成員。在類裡面宣告 ...
C 之過載操作符與友元
操作符過載c 多型的一種形式。過載函式形式 operator op argument list 其中op是操作符,操作符過載限制 1.過載後的操作符必須有至少乙個使用者自定義的型別 防止使用者為標準型別過載操作符 譬如不能過載操作符 去做double型別的減法 2.使用操作符不能違反原操作符的語法規...