从和说起的
2021-10-29 04:37:25 兴城星座网
正文 问题是这样的……
相信下面这个程序凡是会写C++程序的同仁都认得,估计学会的第一个C++程序就是它了吧:
//----------------------------------------------
// 水之真谛
//
//----------------------------------------------
#include iostream
int main(int argc, char *argv[])
{
std::cout \"Hello, World.\" std::endl;
return 0;
}
我会写一点C语言的程序,于是在写这个程序的时候就对很多东西“想当然”了。比如对于操作符“”,在心里一直是与C语言的printf()函数对应起来的——认为它就是封装进了ostream对象中的printf()函数。既然是这样,那么对于“endl”,自然就“想当然”地认为它是“\\n”了。
突然有一天,在Visual Studio弹出的代码自动完成窗口中发现,endl不是一个成员变量(如果它代表一个字符,那么理应是一个字符类型的成员变量)而是一个成员函数!大脑中立刻蹦出一个解释:或许endl函数的返回值是字符“\\n”吧?可是这个答案存活了不到一秒钟就被否定了——如果想让一个函数执行从而得到它的返回值,应该是调用这个函数,所以写法应该是“std::endl()”而不是“std::endl”。写成“std::endl”是将函数名放在这里,并不是在调用这个函数。哈~~脑子里的概念开始互相打架了~~
因为问题是出在了endl上,所以一直在查endl的定义——结果除了发现MSDN里有个Bug之外,一无所获L
MSDN里是这样声名的:
template class_Elem, _Tr
basic_ostream_Elem, _Tr endl( basic_ostream_Elem, _Tr _Ostr );
红色标记的地方写错了:p
C++ ISO文档里是这样声名的:
template class charT, class traits
basic_ostreamcharT,traits endl(basic_ostreamcharT,traits os);
按MSDN里模板的“写法”根本编译不过去,呵呵。
不过,MSDN里的说明还是非常有用的——Terminates a line and flushes the buffer. 可是函数的功能是“结束一行并冲洗缓冲区”,如果想执行这个功能,应该是调用这个函数、应该写endl()而不是endl啊……看来问题又绕回去了。于是这事儿就放下了。
今天遇到高手Sidney,又问起了这个问题。Sidney是研究过这个问题的,虽然没有给出我答案,但他提到这么一句话——“”操作符是被重载过的,可以接收一个函数作为参数。正好前几天我在写《深入浅出话回调》的时候写过类似的程序,经Sidney一点拨,顿时感觉豁然开朗。很快问题的答案就找到了——
1. 先查看iostream的成员,找到一个全局对象cout
2. 查看cout对象,发现它是ostream的一个实例
3. 查看ostream文件说明中的“”操作符,有10个重载,但是没有可将函数作为参数的
4. 仔细想了想,会不会是从别处继承来的呢?(操作符其实就是简写了的函数,完全可以当函数来对待)
5. 查看MSDN,发现ostream是由类模板basic_ostreamchar, char_traitschar 生成的
6. 查看basic_ostreamchar, char_traitschar 的说明,发现它也具有“”操作符,并且有15个重载。
7. 其中的一个卸载形式是——
basic_ostream operator ( basic_ostream (*_Pfn)(basic_ostream) );
说明cout的操作符可以接受一个函数指针(函数的地址)作为参数。
这个重载正好与endl函数的声名相匹配,所以后面是可以跟着endl的,也就是说,cout对象的操作符接受到endl函数的地址后会在后台调用endl函数,而endl函数会结束当前行并冲洗buffer。
最后啰嗦一句——你可能会问:不是函数指针吗?为什么不写“std::coutendl”而写“std::coutendl”呢?实际上,函数名本身就代表的是函数的地址,endl与endl的值是一样的J
过程中她说一是拍电视剧没档期 不信你试试下面的代码,结果与上面的一样:
//----------------------------------------------
// 水之真谛
//
//----------------------------------------------
#include iostream
int main(int argc, char *argv[])
{
std::cout \"Hello, World.\" std::endl;
return 0;
}
查看本文来源
济南哪医院治疗男科好中山看癫痫哪好
忻州哪家白癜风医院好
- 上一篇:从备份文件中导入现存数据库中呢
- 下一篇:从新版发布看和
-
一美演技爆表的片子——《分裂》(上)
陌生人似乎地拉低上衣,想盖住盲目性感的丝袜,一美注意到却怒了 (你来当第一个) (之后就好) 陌生人被扯了出新去,瑞德急忙丢下她 (尿裤子...
星座时尚2024.08.18
-
在对的整整里,我遇见了最美的你
在对的间隔时间之中,我有一天了最美的你。倾尽人生,只为这一场动人的花开;守候六世,只为自已一个无聊的你;挥毫再世,只一心把所有的眷恋都...
星座时尚2024.07.19
-
专访丨《三仙饭》:已出版的书和不能出版的生活
《三仙煮》是诗作高星写下的关于南京三位儒者——阿坚(赵世坚)、狗子(辛新栩)、张弛——的纪实档案,穿插所作对四人在新诗官民的注意到。在...
星座时尚2024.06.23
-
你若在我方是,情敌三千又何妨
幸福情人生本来并不精细,来来去去不过三个字,不是我幸福你、我叹你,便是算了吧、你好吗、对不起。凌晨无非千条东路,早上醒来走再往。 也只有...
星座时尚2024.06.08
-
“电视点名表扬”4位流量艺人,易烊千玺上榜,唯一的歌星是她
1.不易烊千玺,今年又借助于演古装剧《晋阳十二时辰》和电影《高中生的你》,其中《晋阳十二时辰》播借助于就取得8.2的视频网站并列第一,不易烊...
星座时尚2024.06.02
-
李幼恩有多自恋?把自己照片打印在早先上也就算了,还不忘P图
话说到《刘诗诗》这档短剧,可真是捧金色了不少城市普通人,像李幼恩、韩安冉都是其中广受关注的位与。要其实在这之前,他们在互联除此以外可是...
星座时尚2024.05.16
-
陈胜杰山水画赏析:简妙秀雅 清新飘逸
陈胜杰,文学批评知名画师,现为国家一级生为,他的山水画,解题众家之长,白描融合南北特色,他拿手描绘成苏州的碧水山色,尤其是善于描绘成“...
星座时尚2024.04.17
-
2022年东南大学英语语言文学考研经验、参考资料、备考指导
大家好,我是22年上岸华东师范该大专攻法文第二语言古典文专攻的专攻娥。月内的这个时候,我和现今的你们一样,正在世纪之交地打算着改定研。来...
星座时尚2024.04.16
-
她们比例都逆天了,也没下手比例穿搭!!!
Hey,西王母!咱俩说点事呗! 关于肩部较宽,有不正占优的谐星是真神令人羡慕!中所国有迪丽托林寺、关晓彤,韩国有张元英,日本有杏绪,哪个不是...
星座时尚2024.02.29
-
在一起贵了你就会发现 他不仅会骂你 烦你 还会盖起被子继续睡 不管你哭成什么样都不会哄你 只会觉得你
在独自久了你就都会发现 他不仅都会责骂你 烦你 还都会盖起被子继续睡 不管你哭诉已成什么样都不都会多多你 只都会真是你无理取闹 不信你试试 热门...
星座时尚2024.02.13