cout“如何工作?

我想知道如何std::cout能够使用<<因为它的确如此。

我的主要困惑是与是否std::cout作为一个实例。 基本上,如何定义? 如果我这样做一个自定义的类,我需要某种实例…

我可以看到实现它是一种虚空指针或什么的黑客,但我想看看它的实际做法。

这里有人知道吗? 谢谢

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的链接的工作原理与std::ostream之上的工作相同。 +<<都是左关联的,这意味着他们从左到右进行评估。 在运算符重载的情况下,运算符被replace为等效的函数调用。

编辑2 :更详细一点:

假设你是编译器,你正在parsing

 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; 

直到你处理了整个陈述。