2010-11-01 176 views
3

我只是做了我的編程類測驗並得到這個問題的錯誤:>><<和運算符重載

的功能來 返回類型重載運營商<<必須是 參考的ostream對象。

這對我來說看起來不太合適。當然C++比這個更開放。但我想我會在這裏問。這是對的(或錯誤的)?我的C++知識開始真正褪色,當涉及到運算符超載。

+2

對我來說,這聽起來像是一個措辭嚴厲的問題,老師顯然意味着它在流操作符的背景下,但沒有明確說明。運算符超載沒有強制執行這樣的約束,因此你的回答是正確的,我鼓勵你通知他們他們的愚蠢:) – radman 2010-11-01 05:00:07

+0

@radman我已經通過電子郵件發送了我的老師關於這個問題並且現在等待回覆 – Earlz 2010-11-01 05:05:53

回答

15

C++不要求返回類型是對對象ostream的引用。不過,如果你正在嘗試做這樣的事情:

cout << instance_of_custom_type << 3 << "hi" << endl; 

然後,你將需要:

ostream &operator << (ostream &os, custom_type &t); 

但是,如果你喜歡寫一個大的整數類型做的事情,並希望支持位轉移,它可能是這樣的:

BigInt operator << (const BigInt &i, unsigned int shift); 

要有點進一步擴大這一點,原來使用的0123的運營商是爲了位移。例如,1 << 8是256。 C++爲此添加了一個(稍微混淆的)第二次使用,並且在ostream上重載了它以表示「輸出」到流中。在一個重載的操作符中你可以做任何你喜歡的操作 - 它就像一個函數一樣工作,然而,操作符會附帶一個人的期望:程序員期望在C++中,<<是位移或流輸出。

+0

這個我想是什麼測驗是暗示,但措詞含糊不清。 – Earlz 2010-11-01 04:41:33

0

使其返回ostream引用的目的是讓您可以將它們鏈接在一起。否則,您必須編寫cout << 1; cout << " is a number"; cout << endl

2

具有返回類型作爲refernce作爲參考參數傳遞給重載插入運算符在相同的流對象,使我們能夠編寫代碼,如

mystream &operator << (mystream &os, myclass &myobject){ 
    // do whatever 
    return os; 
} 

mystream << myobject << fundamental_type_object; 
1

從視圖的更一般點,operator<<應該總是返回它的左側操作數以連鎖呼叫,就像operator=

當處理<iostreams>庫時,這恰好是對std::ostream的引用。

0

這是不對的。這只是在iostreams的背景下才是正確的,在我的可能不相關的和無趣的意見,應該永遠不會以這種形式出籠。如果你不在你的代碼中包含iostream,你可以做你喜歡的。但我不會重載這些運算符,除了移位類以外,不管是什麼意思,通過整數值,或者可以通過某種可以簡化爲整數值的類。

2

過載運算符<<的函數的返回類型必須是對對象ostream的引用。

要說'必須'是不正確的,可能'通常'是正確的詞,爲什麼?因爲大部分的答案已經指出,它提供了object chaining的便利,同時使用iostreams