我想了解C++,使我們能夠形成在C++下面的表達式的基本過程:我們如何允許在C++中一般鏈接插入運算符和其他運算符?
cout << "Hello," << "World" << a + b;
從我的理解,首先,插入運營商採取的ostream對象cout
和字符串字面"Hello"
作爲操作數,表達式返回cout
的類型,因此cout
現在是下一個字符串文字的類型,最後也是表達式a + b
的類型。
我很難理解這個過程的技術細節,我瞭解引用是允許我們這樣做的嗎?
我想了解C++,使我們能夠形成在C++下面的表達式的基本過程:我們如何允許在C++中一般鏈接插入運算符和其他運算符?
cout << "Hello," << "World" << a + b;
從我的理解,首先,插入運營商採取的ostream對象cout
和字符串字面"Hello"
作爲操作數,表達式返回cout
的類型,因此cout
現在是下一個字符串文字的類型,最後也是表達式a + b
的類型。
我很難理解這個過程的技術細節,我瞭解引用是允許我們這樣做的嗎?
從我的理解,首先,插入運營商採取的ostream對象cout和作爲操作數字符串「你好」和表達式返回類型COUT的...
好爲止。 ..
因此cout現在是下一個字符串文字的類型,最後也是表達式a + b的類型。
我不確定你在說什麼。也許它會幫助,如果運營商按照優先級進行分組:
(((cout << "Hello,") << "World") << (a + b));
首次operator<<
被調用,其參數爲cout
和"Hello"
,如你所說。那返回cout
。然後,第二次,參數是cout
(前一個的結果)和"World"
。然後,第三次,參數是cout
和a + b
的結果。
也許這將有助於進一步改寫使用的代碼(在技術上不正確,請參閱@DavidRodríguez-dribeas的評論)函數調用的語法:
operator<<(operator<<(operator<<(cout, "Hello,"), "World"), a + b);
因爲每次operator<<
被稱爲返回cout
,第一個參數每次通話的電話號碼爲cout
。
那麼,從第一個表達式cout <<「Hello」實際返回什麼?一個指向cout的指針? –
@MutatingAlgorithm對「cout」的引用。同一個'cout'對象,不是副本。 –
小記:使用'operator <<'的語法不正確,它有助於理解(這裏沒有負面投票),但是不正確。將操作符擴展爲等價的函數語法是非常棘手的,因爲操作符可能被實現爲自由函數或成員函數,並且函數的語法等效將不同。 –
你可以認爲<<
運營商作爲正在實施這樣的事情在標準輸入輸出功能方面(考慮串現在只):
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
值的副作用)。
移位運算符<<
組從左到右。所以聲明
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_ostream
。 std::cout
是如此執行
cout << "Hello,"
你參考std::cout
後定義爲類型basic_iostream<char>
的對象。這反過來又成爲表達
cout << "World"
的左操作數和在最後返回上述表達式的參考becames表達
的左操作數cout << a + b
其中a和b爲我想是一些算術類型。該表達式是針對std::basic_ostream
和此算術類型的重載運算符函數調用。
由於此運算符返回引用std_basic_ostream
或更確切地說到std::cout
它成爲完整表達式的返回類型。
推薦閱讀:http://stackoverflow.com/a/19122747/1870232 – P0W