簡體   English   中英

cout << 實際上是如何工作的?

[英]how does cout << actually work?

我想知道std::cout如何能夠像它那樣使用<<

我的主要困惑是std::cout是否是某事的一個實例。 基本上, <<是如何定義的? 如果我為自定義類執行此操作,我需要某種實例......

我可以將其實現為一種帶有 void 指針或其他東西的 hack,但我想看看它的實際完成方式。

這里有人知道嗎? 謝謝

std::coutstd::ostream一個實例。 std::cout << "something"調用operator<<重載之一,就像對std::ostream任何實例所做的那樣。

它是“特殊的”,因為它引用了控制台,但除此之外,它的行為與ofstreamostringstream完全一樣。

編輯:鏈接就像它適用於任何其他運營商一樣工作。 考慮:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM