2011-08-24 103 views
4

當你爲一個類重載一個類的< <運算符(假設它被定義爲SomeClass中的一個朋友)時,爲什麼你都引用ostream並返回該ostream?Ostream << overloading confusion

ostream& operator<<(ostream& s, const SomeClass& c) { 
    //whatever 
    return s; 
} 

什麼好處可以返回ostream時,它已經可以直接修改引用?這似乎是多餘的,我 - 儘管我敢肯定它不是:)

回答

4

這不是多餘的,但對於鏈接調用非常有用。它很容易看到類似的std :: string ::附加功能,所以我會與開始:

std::string mystring("first"); 
mystring.append(" second"); 
mystring.append(" third"); 

可以改寫爲:

std::string mystring("first").append(" second").append(" third"); 

這是可能的,因爲.append()返回對它修改的字符串的引用,所以我們可以繼續添加.append(...)到最後。與您正在做什麼相關的代碼正在改變:

std::cout << "first"; 
std::cout << " second"; 
std::cout << " third"; 

進入此。由於運營商< <返回流,我們也可以鏈接這些!

std::cout << "first" << " second" << " third"; 

看到相似性和有用性?

+0

謝謝 - 每個人都有類似的答案,但我讚賞這個例子 - 它使得它更加明顯。 :) –

4

所以,你可以寫的operator<<鏈接,調用爲:

stream << s1 << s2 << s3 ; 

如果你不回ostream&,那麼你就不能寫它不止一次。

你能想到的,無論是作爲:

operator<<(operator<<(operator<<(stream, s1), s2), s3); 

或者像,

((stream << s1) << s2) << s3 ; 

首先(stream << s1)回報stream&上,您再次調用<<,並且變得stream << s2這對您再次返回stream&調用<<並且它變成stream << s3

5

它允許一起「鏈」輸出。如:

std::cout << someObj << someValue; 

這相當於是這樣的:

operator<<(operator<<(std::cout, someObj), someValue); 
1

啊,這是如此連接的輸出,象

COUT < < 「這」 < < 「爲」 < < 「筆」 < < ENDL;

仍然有效。