cout << expr
和cout.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*)
,这将每个字符插入到输出流中。
cout << expr
等同于cout.operator<<(expr)
*”并不是普遍适用的。第二个问题的答案和第一个评论解释了这一点。不确定是否算重复...也许这会有所帮助:https://dev59.com/MFoV5IYBdhLWcg3wA66x#36809565。 - luk32