C 友元過載輸出操作符(下篇)

2021-10-07 04:44:17 字數 1748 閱讀 1370

假設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.使用操作符不能違反原操作符的語法規...