當你爲一個類重載一個類的< <運算符(假設它被定義爲SomeClass中的一個朋友)時,爲什麼你都引用ostream並返回該ostream?Ostream << overloading confusion
ostream& operator<<(ostream& s, const SomeClass& c) {
//whatever
return s;
}
什麼好處可以返回ostream時,它已經可以直接修改引用?這似乎是多餘的,我 - 儘管我敢肯定它不是:)
當你爲一個類重載一個類的< <運算符(假設它被定義爲SomeClass中的一個朋友)時,爲什麼你都引用ostream並返回該ostream?Ostream << overloading confusion
ostream& operator<<(ostream& s, const SomeClass& c) {
//whatever
return s;
}
什麼好處可以返回ostream時,它已經可以直接修改引用?這似乎是多餘的,我 - 儘管我敢肯定它不是:)
這不是多餘的,但對於鏈接調用非常有用。它很容易看到類似的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";
看到相似性和有用性?
所以,你可以寫的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
。
它允許一起「鏈」輸出。如:
std::cout << someObj << someValue;
這相當於是這樣的:
operator<<(operator<<(std::cout, someObj), someValue);
啊,這是如此連接的輸出,象
COUT < < 「這」 < < 「爲」 < < 「筆」 < < ENDL;
仍然有效。
謝謝 - 每個人都有類似的答案,但我讚賞這個例子 - 它使得它更加明顯。 :) –