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

时间:2017-06-07 14:01:59

标签: c++ operator-overloading iostream cout

根据this question的最佳答案,cout << expr相当于cout.operator<<(expr)

根据对this question的回复,上述陈述是不真实的。

根据我自己的测试,cout.operator<<()在给定整数时与cout <<相同。给定一个浮点数时,cout.operator<<()将它强制转换为整数。给定字符串文字时,如cout.operator<<("hello world")中所示,它输出的内容似乎是内存地址。当给定一个包含std :: string的变量时,它会产生编译错误。

任何人都可以对正在发生的事情进行初级到中级的解释吗?

2 个答案:

答案 0 :(得分:5)

取决于expr

这两个问题的答案都是针对具体案例而非全面保证。

事实上,operator<<中的一些this free,有些functions

查阅您最喜欢的C ++参考,找出哪一个。

答案 1 :(得分:3)

cout << exprcout.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*),然后将每个字符插入输出中。