根据this question的最佳答案,cout << expr
相当于cout.operator<<(expr)
。
根据对this question的回复,上述陈述是不真实的。
根据我自己的测试,cout.operator<<()
在给定整数时与cout <<
相同。给定一个浮点数时,cout.operator<<()
将它强制转换为整数。给定字符串文字时,如cout.operator<<("hello world")
中所示,它输出的内容似乎是内存地址。当给定一个包含std :: string的变量时,它会产生编译错误。
任何人都可以对正在发生的事情进行初级到中级的解释吗?
答案 0 :(得分:5)
答案 1 :(得分:3)
cout << expr
和cout.operator<<(expr)
的等效性取决于expr
是什么。
如果它成为&#34;内置&#34;类型,cout
&#34;知道&#34;约,然后是,它相当于cout.operator<<(expr)
(成员函数)。
如果是&#34;用户类型&#34; (并且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*)
,然后将每个字符插入输出中。