重载函数

lovelylan9510 2008-12-19 11:30:04
在class A中有一个友元函数:friend ostream& operator << (ostream& out,constA &a);
书上说,操作符"<<"的重载函数的返回值类型之所以定义为引用类型,是为了能够进行下面的连续输出操作:
A a,b;
cout<<a<<endl<<b<<endl;
能帮我解释一下吗?没看懂,谢谢
...全文
187 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingteng 2008-12-20
  • 打赏
  • 举报
回复
cout < <a 返回一个流,相当于又是一个cout就可以和后面的继续组合在一起输出了,c++ primer上有叙述
Cpp权哥 2008-12-20
  • 打赏
  • 举报
回复
cin和cout不可复制,是因为它们所属的istream类和ostream类中把拷贝构造函数(也就是复制构造函数)定义成私有成员了。
PcrazyC 2008-12-20
  • 打赏
  • 举报
回复
friend ostream& operator < < (ostream& out,constA &a);
cout < <a < <endl < <b < <endl;

//cout是ostream类型,有了上面的函数支持就可以执行cout << a;其返回类型就是上面所设计的ostream &,返回值就是cout,既然返回的是cout,那么当然可以继续使用<<运算符了,即继续输出b(cout<<b)
Cpp权哥 2008-12-20
  • 打赏
  • 举报
回复
书上说的是不对的,它说的是返回类型定义为ostream的原因,而不是引用类型的原因。
<<也是一个运算符,cout << a也是一个运算,类似x + y那样。运算就应该有个结果。对于基本的整数、小数之类的数据,系统有内定的运算方法。对基本的数据类型的数据和endl,系统也有内定的跟cout的 << 运算,这个运算的操作就是把数据显示到标准输出上,并且把cout作为计算结果。因为计算结果又是cout,所以还可以把这个结果当作cout来继续进行后面跟下一个数据的 << 运算。比如,3+2的运算结果是5,我想再用这个5来加上8,我们就可以写成3+2+8。同样cout << 12.3这个运算的操作是在屏幕上显示出12.3并且运算结果是cout,如果想再用这个cout来输出"hello",我们就可以写成cout << 12.3 << "hello"。
自己进行<<运算符重载就是自己写一个operator<<函数,在函数中用一些语句来指定这个运算的操作是什么,用函数的返回类型和函数中的return语句来指定运算结果是什么。因为只有cout才能进行<<运算(先这么认为吧,高手们不要在这里找茬),所以如果想在这个运算后面再接<<运算,那么这运算结果必须还是cout。而cout这个对象的类型是ostream,返回类型必须是运算结果的类型,因此返回类型定义为ostream。

至于引用,是这么个道理。一个函数的返回值,也就是函数中return语句中那个值,一般是开辟一块临时空间来把那个值复制一份作为返回值。如果把返回类型定义成引用类型,则表示直接使用return语句中那个值作为返回值,这样就免得开辟空间又省得复制数据了,而且有的类型的数据是不允许复制的,cout就是这样的数据之一。

Cpp权哥 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 lovelylan9510 的帖子:]
在class A中有一个友元函数:friend ostream& operator < < (ostream& out,constA &a);
书上说,操作符" < <"的重载函数的返回值类型之所以定义为引用类型,是为了能够进行下面的连续输出操作:
A a,b;
cout < <a < <endl < <b < <endl;
能帮我解释一下吗?没看懂,谢谢
[/Quote]

书上说的是不对的,它说的是返回类型定义为ostream的原因,而不是引用类型的原因。
<<也是一个运算符,cout << a也是一个运算,类似x + y那样。运算就应该有个结果。对于基本的整数、小数之类的数据,系统有内定的运算方法。对基本的数据类型的数据和endl,系统也有内定的跟cout的 << 运算,这个运算的操作就是把数据显示到标准输出上,并且把cout作为计算结果。因为计算结果又是cout,所以还可以把这个结果当作cout来继续进行后面跟下一个数据的 << 运算。比如,3+2的运算结果是5,我想再用这个5来加上8,我们就可以写成3+2+8。同样cout << 12.3这个运算的操作是在屏幕上显示出12.3并且运算结果是cout,如果想再用这个cout来输出"hello",我们就可以写成cout << 12.3 << "hello"。
自己进行<<运算符重载就是自己写一个operator<<函数,在函数中用一些语句来指定这个运算的操作是什么,用函数的返回类型和函数中的return语句来指定运算结果是什么。因为只有cout才能进行<<运算(先这么认为吧,高手们不要在这里找茬),所以如果想在这个运算后面再接<<运算,那么这运算结果必须还是cout。而cout这个对象的类型是ostream,返回类型必须是运算结果的类型,因此返回类型定义为ostream。

至于引用,是这么个道理。一个函数的返回值,也就是函数中return语句中那个值,一般是开辟一块临时空间来把那个值复制一份作为返回值。如果把返回类型定义成引用类型,则表示直接使用return语句中那个值作为返回值,这样就免得开辟空间又省得复制数据了,而且有的类型的数据是不允许复制的,cout就是这样的数据之一。
小马哥哥哥 2008-12-20
  • 打赏
  • 举报
回复
菜鸟一个精神支持一下,
Dreamz 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 SearchLife 的回复:]
学习,为什么cin,cout这些流都是不可复制的?^_^
[/Quote]
同问,呵呵
Dreamz 2008-12-20
  • 打赏
  • 举报
回复
cout <<a; 的结果是 cout流,加上操作符的左结合性,所以其 << 可以进行 cout<<..<<..<<..; 式的重叠操作.
若 << 返回的是一个非引用型的流,返回时将对cout进行复制,产生一个临时流,它会随着重叠操作而引起更多不必要的创建流的操作,会导致内存浪费和性能下降.
这是我看的那本书上的讲解,呵呵.
SearchLife 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lann64 的回复:]
C/C++ code
lhs<<rhs;这样写相当于:operator<<(lhs,rhs)

那么cout<<a<<endl<<b<<endl;就相当于
operator<<(operator<<(operator<<(operator<<(cout,a),endl),b),endl);
这样看懂了吗?每次调用operator<<后的返回值,做下一次调用的第一个参数。所以必须返回流。
由于cin,cout这些流都是不可复制的,所以返回类型只能是流的引用(ostream&)
[/Quote]

学习,为什么cin,cout这些流都是不可复制的?^_^
Dreamz 2008-12-20
  • 打赏
  • 举报
回复
楼主也在看钱能的C++教程么?这条语句和我早上看过的内容一样= =
lovelylan9510 2008-12-20
  • 打赏
  • 举报
回复
那在这里cout < <a具体返回的是什么呢?
qingkongyihe2008 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenzongquan1973 的回复:]
cin和cout不可复制,是因为它们所属的istream类和ostream类中把拷贝构造函数(也就是复制构造函数)定义成私有成员了。
[/Quote]
bill830711 2008-12-20
  • 打赏
  • 举报
回复
1楼的解释有点复杂
这样理解

cout<<a 调用 opearot<<(cout,a) 那么返回的是cout本身


cout < <a < <endl < <b < <endl;
对于这个表达式,operator<< 是平级的,那么从左往右执行,等价于 ((((cout<<a)<<endl)<<b)<<endl);
cout < <a < <endl < <b < <endl;
cout < <endl < <b < <endl;
cout < <b < <endl;
cout << endl;
cout
lp198510 2008-12-20
  • 打赏
  • 举报
回复
xue xi
ypb362148418 2008-12-20
  • 打赏
  • 举报
回复
首先引用是为了不重新建立对象,你的那个运算符重载只能一次打印一个变量的值,你上面的输出是错误的,应该是cout<<a<<endl ,在编译器中是这样认为的:cout.operater<<a
太乙 2008-12-20
  • 打赏
  • 举报
回复
ffffjjjjj
lann64 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Dreamz 的回复:]
引用 7 楼 SearchLife 的回复:
学习,为什么cin,cout这些流都是不可复制的?^_^

同问,呵呵
[/Quote]
c++标准规定了不允许复制,所以现在的c++编译器都按照不能复制来实现cin、cout
nnliubin 2008-12-20
  • 打赏
  • 举报
回复
简单一点说就是为了实现cout<<a<<b这样的连续输出
xmu_才盛 2008-12-20
  • 打赏
  • 举报
回复
mark
xiaoyisnail 2008-12-19
  • 打赏
  • 举报
回复
cout < <a < <endl < <b < <endl;
//cout<<a相当于调用了operator<<(cout,a),返回类型为ostream&,接着就可以在这个引用上继续调用operator<<,如果那个友元函数的返回值不定义为引用,那么第一次调用operator<<后返回的是cout的一个副本,后续的<<操作就变成在这个副本上执行了,那样就无法达到在cout上连续输出的语义了
加载更多回复(2)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧