如何使用std::cout?

3

2
相关:https://dev59.com/kFvUa4cB1Zd3GeqPtnXW - CB Bailey
感谢Charles Bailey提供的链接。 - Swathi Appari
2个回答

9
因为ostream重载了operator void*(),所以这是调用operator <<的最佳匹配,(void*)cout的转换结果被打印出来,这在你的情况下即为该地址。请记住,cout是一个对象。
基本上,调用可转换为:
cout.operator<<((void*)cout);

为什么C++使用<<运算符?不带括号调用函数? - Pooya
2
@Pooya 在 C++ 中,你可以重载运算符以方便输入。这个主题需要进行研究,因为在评论中解释太多了。 - Luchian Grigore
是的,我知道运算符重载,但是你使用 << 来进行按右操作数移位。 - Pooya
2
@Pooya,虽然在C语言中,它严格用于位移操作,在C++中,它被重载为流操作符,如输入和输出流。当它像这样使用时,它实际上与位移操作无关了。你可以让operator+执行减法,但区别在于,这里已经深入人心,使其在上下文中有意义,而我的例子则是荒谬的。 - chris
1
是的,我发现在C++中,流输出和流输入分别使用重载运算符<<和>>。 - Pooya

2
cout是一个ostream对象,它有一个重载的插入(<<)运算符。如果我们看一下ostream类的构造函数,会发现需要传递一个参数,这个参数是指向streambuf对象的指针。streambuf对象通常与一个字符序列相关联,用于读写数据。对于控制台应用程序,标准输出会有一个这样的字符缓冲区,可能在cout内部使用。文档中说我们不应该直接实例化ostream对象,而是使用任何派生类ofstreamostringstream,从而将注意力转移到stdout上。

关于打印地址的问题,我认为Luchian Grigore是正确的。

这个问题可以让你了解cout对象是如何实例化的:How is the object std::cout constructed/instantiated


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接