对用cout输出cout.put的解释

如下:

#include 
using namespace std;

int main()
 {
     cout<

输出:A0x0047BE94

以上是今天被问到的一个问题:为什么输出的还多了串奇怪的十六进制数?

这是错误地认为cout.put(65)执行时不进行输出,以及cout对象的成员函数put的返回值是'A'。


查看put()方法的原型: ostream& put(char);

查看<<的原型: ostream& operator<<(type);    

 type是要显示的数据的类型 ,type可以是unsigned char,signed char,char,short,.....等很多很多。

                                                                            


我们这里关注到的是<<运算符的返回值类型和put()方法是一样的,通过类比的思想可以说明cout.put(65)执行时同使用<<,会进行输出。//创建cout对象的时候将打开一个流,并自动创建缓冲区,与流关联,刷新缓冲区时就执行输出了,put方法具体怎么刷新缓冲区,就需要去查看streambuf类了,这里不深究

而返回类型osteam&意味着使用<<运算符或者put成员函数将返回一个指向调用该运算符的对象cout的引用,而非实参的类型。


执行cout<<1;,相当于cout.operator<<(1),最后返回了插入了新的int型数据1的cout对象,输出。

执行cout.put(65); 相当于,先把65从int转换成char,也就是'A',最后返回了插入了新的char型数据‘A’的cout对象,输出。


而返回ostream&也是cout可拼接性的技术保证(ostream就不行),可以看这样一个例子:

cout<

如果返回值类型是ostream,第一个()中返回cout的临时变量,它不可以作为左值(因为operator << (ostream& os, Point& pt)的第一个参数是ostream&,而不是ostream),因而错误。

如果返回值类型是&ostream,(cout<


所以说被<<运算符输出的0x0047BE94应该是ostream&类型的值。

但是我通过调试发现对用cout输出cout.put的解释_第1张图片

与事实并不符合。


查找资料:这个ostream根据规定可以隐式转化为void*,所以0x0047BE94确实应该是一个void*类型指针的16进制值。

验证结束。



题外话:

刚开始思考这个十六进制数的时候想的是,它是cout.put函数的地址,然后进行输出这个函数地址时就遇到了麻烦。。输出值是1,= =,网上找到资料看了看,cout<<&ostream::put;结果为1的原因是put函数不是静态函数(不是类所拥有的),而是动态函数(即只能通过对象来调用,因为同一类型的不同对象,它们拥有类中成员变量的不同副本啊)。。。。详见感谢中的《获取成员函数地址及获取函数地址》一文,最后用文中方法输出来看看了是0x004123F...

#include 
#include 
using namespace std;
int main()
{
	cout<<&ostream::put<

 




感谢:

为什么返回值是ostream&  

http://blog.163.com/dianwuwang@126/blog/static/133646035201011974624600/


获取成员函数地址及获取函数地址


http://blog.csdn.net/zzhays/article/details/8036098






你可能感兴趣的:(Normal)