2014-12-31 208 views
1

我在理解< <運算符時遇到了一些問題。<<操作員如何工作?

如果我有:

#include <iostream> 
using namespace std; 
//... 

int t = 5; 
cout << "test is: " << t << endl; 

現在的功能操作< <被調用。

ostream& operator<<(ostream& out, string* s) 
{ 
    return out << s << endl; 
} 


ostream& operator<<(ostream& out, int* value) 
{ 
    return out << value << endl; 
} 

的字符串指針所指向的地址與價值測試:但什麼元素out參考(以cout?)?並且ostream &的功能主體正確嗎?

非常感謝你的任何解釋。

+1

能幫你可能會看到'COUT << 「測試」 << t'爲等同'運算符<<(操作員<<(COUT,「測試「),t)'。 –

回答

1

首先,讓我們來解決您的代碼:運營商應該採取const引用或值而不是指針:

ostream& operator<<(ostream& out, const string& s) // const reference 
ostream& operator<<(ostream& out, int i)   // value 

現在你的問題:你是正確的,out參數接收參考cout,或者是從<<左側的表達式返回的ostream&<<左邊的表達式不一定是cout,但其他常見情況是鏈接和流操縱器的其他<<運算符*的結果。在所有情況下,這些表達式返回對ostream的引用,以便「鏈」可以繼續。

*operator<<返回ostream&的原因是,您可以鏈接輸出。在絕大多數情況下,您將返回與第一個參數相同的ostream&,儘管標準C++庫的部分沒有限制要求您這樣做。

0

這是不正確的。它的int不是int*,和char const*不是string*

out,當然在本例中是指std::cout。它還會是什麼?

沒有那些身體不正確的絲毫—他們試圖無限地重新自我激勵,並沒有別的。

+0

你的意思是['char const *'](http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2)作爲參數? – Columbo

+0

@Columbo:假設是的,是的(27.7.3.6.4) –

+0

我不明白他們爲什麼無限地重新開始自己。因爲如果你超載操作員,你寫:return out << v.a <<「/」<< v.b;並沒有自我調用。函數體不是必需的,但它應該作爲我自己的解釋。 (與操作符重載平行以更好地理解功能) – Susliks

0
int t = 5; 
cout << "test is: " << t << endl; 

首先呼叫將是: -

ostream& operator<<(ostream& out, const char* str) 

出來= COUT

STR = 「試驗是:」

第二呼叫將在對象被施加通過第一呼叫返回這是ostream

ostream& operator<<(ostream& out, int x) 

出來= COUT

X =噸