cout“如何工作?
我想知道如何std::cout
能够使用<<
因为它的确如此。
我的主要困惑是与是否std::cout
作为一个实例。 基本上,如何定义? 如果我这样做一个自定义的类,我需要某种实例…
我可以看到实现它是一种虚空指针或什么的黑客,但我想看看它的实际做法。
这里有人知道吗? 谢谢
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的链接的工作原理与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;
直到你处理了整个陈述。