对用cout输出cout.put的解释
Posted 独饮月色的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对用cout输出cout.put的解释相关的知识,希望对你有一定的参考价值。
如下:
#include <iostream>
using namespace std;
int main()
cout<<cout.put(65)<<endl;
return 0;
输出: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<<a<<b; //相当于(cout<<a)<<b;
如果返回值类型是ostream,第一个()中返回cout的临时变量,它不可以作为左值(因为operator << (ostream& os, Point& pt)的第一个参数是ostream&,而不是ostream),因而错误。
如果返回值类型是&ostream,(cout<<a)返回cout的引用,即就是它自己,它可以再次作为左值,因而能够连着写这个输出流 。
所以说被<<运算符输出的0x0047BE94应该是ostream&类型的值。
但是我通过调试发现
与事实并不符合。
查找资料:这个ostream根据规定可以隐式转化为void*,所以0x0047BE94确实应该是一个void*类型指针的16进制值。
验证结束。
题外话:
刚开始思考这个十六进制数的时候想的是,它是cout.put函数的地址,然后进行输出这个函数地址时就遇到了麻烦。。输出值是1,= =,网上找到资料看了看,cout<<&ostream::put;结果为1的原因是put函数不是静态函数(不是类所拥有的),而是动态函数(即只能通过对象来调用,因为同一类型的不同对象,它们拥有类中成员变量的不同副本啊)。。。。详见感谢中的《获取成员函数地址及获取函数地址》一文,最后用文中方法输出来看看了是0x004123F...
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
cout<<&ostream::put<<endl;
printf( "address of cout::put %X\\n", &ostream::put);
return 0;
感谢:
为什么返回值是ostream&
http://blog.163.com/dianwuwang@126/blog/static/133646035201011974624600/
获取成员函数地址及获取函数地址
http://blog.csdn.net/zzhays/article/details/8036098
以上是关于对用cout输出cout.put的解释的主要内容,如果未能解决你的问题,请参考以下文章