[英]how does cout << actually work?
我想知道std::cout
如何能夠像它那樣使用<<
。
我的主要困惑是std::cout
是否是某事的一個實例。 基本上, <<
是如何定義的? 如果我為自定義類執行此操作,我需要某種實例......
我可以將其實現為一種帶有 void 指針或其他東西的 hack,但我想看看它的實際完成方式。
這里有人知道嗎? 謝謝
std::cout
是std::ostream
一個實例。 std::cout << "something"
調用operator<<
重載之一,就像對std::ostream
任何實例所做的那樣。
它是“特殊的”,因為它引用了控制台,但除此之外,它的行為與ofstream
或ostringstream
完全一樣。
編輯:鏈接就像它適用於任何其他運營商一樣工作。 考慮:
class MyType
{
friend std::ostream& operator<<(std::ostream& target, const MyType& source);
int val;
public:
MyType()
: val(0)
{ }
MyType& Add(int toAdd)
{
val += toAdd;
return *this;
}
};
MyType& operator+(MyType& target, int toAdd)
{
return target.Add(toAdd);
}
std::ostream& operator<<(std::ostream& target, const MyType& source)
{
target << source.val;
return target; //Make chaining work
}
int main()
{
MyType value1;
value1 + 2 + 3 + 4;
std::cout << value1 << " and done!" << std::endl;
}
在這種情況下, MyType
上 +s 的鏈接與<<
s 在std::ostream
之上工作的原因相同。 +
和<<
都是左關聯的,這意味着它們是從左到右計算的。 在運算符重載的情況下,運算符被替換為等效的函數調用。
EDIT2 :更詳細一點:
假設您是編譯器並且您正在解析
std::cout << value1 << " and done!" << std::endl;
首先, <<
是左結合的,所以你從左邊開始。 您評估第一個<<
並將其轉換為函數調用:
operator<<(std::cout, value1) << " and done!" << std::endl;
然后您會看到您再次擁有一個std::ostream
(對operator<<
的調用結果)和一個char *
,您再次將其轉換為函數調用:
operator<<(operator<<(std::cout, value1)," and done!") << std::endl;
依此類推,直到您處理完整個語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.