2014-03-02 49 views
3

我想了解C++,使我們能夠形成在C++下面的表達式的基本過程:我們如何允許在C++中一般鏈接插入運算符和其他運算符?

cout << "Hello," << "World" << a + b; 

從我的理解,首先,插入運營商採取的ostream對象cout和字符串字面"Hello"作爲操作數,表達式返回cout的類型,因此cout現在是下一個字符串文字的類型,最後也是表達式a + b的類型。

我很難理解這個過程的技術細節,我瞭解引用是允許我們這樣做的嗎?

+0

推薦閱讀:http://stackoverflow.com/a/19122747/1870232 – P0W

回答

5

從我的理解,首先,插入運營商採取的ostream對象cout和作爲操作數字符串「你好」和表達式返回類型COUT的...

好爲止。 ..

因此cout現在是下一個字符串文字的類型,最後也是表達式a + b的類型。

我不確定你在說什麼。也許它會幫助,如果運營商按照優先級進行分組:

(((cout << "Hello,") << "World") << (a + b)); 

首次operator<<被調用,其參數爲cout"Hello",如你所說。那返回cout。然後,第二次,參數是cout(前一個的結果)和"World"。然後,第三次,參數是couta + b的結果。

也許這將有助於進一步改寫使用的代碼(在技術上不正確,請參閱@DavidRodríguez-dribeas的評論)函數調用的語法:

operator<<(operator<<(operator<<(cout, "Hello,"), "World"), a + b); 

因爲每次operator<<被稱爲返回cout,第一個參數每次通話的電話號碼爲cout

+0

那麼,從第一個表達式cout <<「Hello」實際返回什麼?一個指向cout的指針? –

+2

@MutatingAlgorithm對「cout」的引用。同一個'cout'對象,不是副本。 –

+0

小記:使用'operator <<'的語法不正確,它有助於理解(這裏沒有負面投票),但是不正確。將操作符擴展爲等價的函數語法是非常棘手的,因爲操作符可能被實現爲自由函數或成員函數,並且函數的語法等效將不同。 –

5

你可以認爲<<運營商作爲正在實施這樣的事情在標準輸入輸出功能方面(考慮串現在只):

ostream &operator <<(ostream &stream, const string &data) 
{ 
    fprintf(stream, "%s", data.c_str()); 
    return stream; 
} 

此代碼不正是上班寫入的,因爲第一個參數到fprintf應該是FILE*,而不是ostream。但這並不重要。與您的問題相關的重要部分是末尾的return stream;,它返回您返回給調用者的相同流。有了這個,你可以把呼叫連在一起。

表達

cout << a << b; 

相同

(cout << a) << b; 

(cout << a)的結果是再次cout(加的實際打印的a值的副作用)。

1

移位運算符<<組從左到右。所以聲明

cout << "Hello," << "World" << a + b; 

對應於表達

(((cout << "Hello,") << "World") << a + b); 

在表達

cout << "Hello," 

有用於重載運算功能< <爲std::basic_ostream型的左操作數和類型的右操作數const char *

template<class charT, class traits> 
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*); 

它返回參考basic_ostreamstd::cout是如此執行

cout << "Hello," 

你參考std::cout後定義爲類型basic_iostream<char>

的對象。這反過來又成爲表達

cout << "World" 

的左操作數和在最後返回上述表達式的參考becames表達

的左操作數
cout << a + b 

其中a和b爲我想是一些算術類型。該表達式是針對std::basic_ostream和此算術類型的重載運算符函數調用。

由於此運算符返回引用std_basic_ostream或更確切地說到std::cout它成爲完整表達式的返回類型。