2012-06-16 23 views
1
ostream& operator<<(ostream& os, const PT& p) 
{ 
    os << "(" << p.x << "," << p.y << ")"; 
} 

PT是一個結構和xy是其成員。
有人可以解釋一下上面的行是什麼。不能用cout打印想要的文字?難度中的ostream

我遇到了this site這段代碼。

+4

嗯,首先人的這個代碼包含一個錯誤。 :-( –

+0

什麼問題? - 返回操作系統缺失? – VenkateshJN

+0

是的,就是這樣。 –

回答

1

這提供了輸出PT的方法。現在,你可以使用這個:

PT p; 
std::cout << p; 

這被翻譯成

operator<< (std::cout, p); 

打電話符合您超載,所以它的工作原理,與上事半功倍打印在括號中的x和y的值用戶的一部分。事實上,它不一定是cout。它可以是任何「是」std::ostream。有很多東西可以繼承,也就是說,它們也是std::ostream,所以這也適用於它們。 std::ofstream,對於文件I/O,就是一個例子。

您發現的樣本有一件事不能做,但應該是return os;。如果不這樣做,則不能說std::cout << p << '\n';,因爲打印p的結果不會返回cout供您用來打印換行符。

+0

你的意思不是寫這個 - ostream&operator <<(ostream&os,const PT&p){os <<「(」<< p.x <<「,」<< p.y <<「)」;我們可以寫這個 - std :: cout << p – VenkateshJN

+0

@ user1460207,你已經重載了'operator <<'。通常,當你說'std :: cout << p;'時,它不知道如何輸出'PT'。現在你告訴它,每當它試圖打印一個「PT」時,它應該打印'「(」+ pt.x +「,」+ pt.y +「)」'。否則,你必須格式化所有用來輸出像這樣的PT的語句,這非常冗餘。 – chris

+0

明白了:)。非常感謝! – VenkateshJN

4

這是custom overloadoperator<<

這意味着你可以這樣做:

PT p = ...; 
std::cout << p << "\n"; 

或本:

PT p = ...; 
std::stringstream ss; 
ss << p << "\n"; 
std::cout << ss; 

或很多其他有用的東西。

但是,應該指出,你引用的代碼將無法正常工作。它需要返回os

+0

爲什麼需要寫這行:std :: cout << ss – VenkateshJN

+0

它是什麼原因返回os? – VenkateshJN

+0

@ user1460207,這與'cout << ss'無關。這是一個照顧,因爲'std :: stringstream'已經做了你在這裏做的。感興趣的部分是'ss << p',其中'cout'不是'ostream&',而是'ss'。它證明它不僅僅是'cout'。至於返回,它可以級聯調用:'cout << p1 <<''<< p2;'。你將需要'cout'來輸出p1之後的東西。 – chris

0

它允許運營商將PT對象附加到流中。看起來該對象具有添加了逗號分隔符的元素x和y。

0

該運算符< <重載用於輸出PT類的對象。

這裏:

ostream& operator<<(ostream& os, const PT& p) 

第一個參數是對於其中p將附加輸出流。 它返回參考OS的鏈接是這樣的:

cout << pt << " it was pt" << endl;