理解cout.operator<<()的行为

5
根据这个问题的最佳答案,cout << expr等同于cout.operator<<(expr)
根据这个问题的回答,上述说法是不正确的。
经过我的测试,当给出一个整数时,cout.operator<<()cout <<相同。当给出一个浮点数时,cout.operator<<()将其强制转换为整数。当给出一个字符串字面量,如cout.operator<<("hello world"),它输出的似乎是一个内存地址。当给出一个保存std::string的变量时,它会产生编译错误。
能否有人以初学者到中级水平的方式解释一下发生了什么?

“*cout << expr等同于cout.operator<<(expr)*”并不是普遍适用的。第二个问题的答案和第一个评论解释了这一点。不确定是否算重复...也许这会有所帮助:https://dev59.com/MFoV5IYBdhLWcg3wA66x#36809565。 - luk32
2个回答

5

它取决于expr的情况。

这两个问题的答案都是针对特定情况而言,而不是一概而论的保证。

实际上,有些operator<<是作为自由函数存在的,而有些则是成员函数

请查询您喜欢的C++参考资料以了解详情。


3
cout << exprcout.operator<<(expr)的等价性取决于expr是什么。

如果它是“内置”的类型,那么cout“知道”的内容,那么是等价于成员函数cout.operator<<(expr)的(一个成员函数)。

如果它是一个“用户类型”(包括std::string),那么它是一种重载的非成员方法,其签名类似于std::ostream& operator<<(std::ostream&, const std::string&);等。

为什么cout.operator<<("hello world")会输出一个内存地址?

对于上述情况,由于强制使用成员方法,最佳的成员方法重载是ostream& operator<<(const void* value);,它输出指针的值(而不是指向的内容)。

相比之下,cout << "hello world"调用非成员重载ostream& operator<<(ostream&, const char*),这将每个字符插入到输出流中。


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