请教ostream & operator<<的问题 ??

sxj0384 2010-04-13 09:37:47

#include <iostream>

using namespace std;

main()
{
string s="test ";
ostream & operator<<(ostream &os, string &aa);

cout<< s;
system("pause");
}
ostream &operator<<(ostream &cout, string &aa)
{
cout<< aa + "111" << endl;
return cout;
}

各位高手上面的c++代码中的
ostream & operator<<(ostream &os, string &aa);
sring &aa一定要是引用类型的吗?
为什么我去掉声明和定义中的&
改为string aa再运行时
就没有输出了呢?
这是为什么请指教,不胜感激!!
...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxj0384 2010-04-14
  • 打赏
  • 举报
回复
多谢各位,我明白了!
arong1234 2010-04-13
  • 打赏
  • 举报
回复
你定义的这个函数,在底下cout << aa + "111"不是又呗调用了么?[Quote=引用 6 楼 sxj0384 的回复:]
引用 3 楼 lhcwjy 的回复:

不加时成了递归调用,最后堆栈溢出。
加&amp;时库里本来就有这个定义,调用时先调用自定义的,在自定义的里面再调用库里定义的,所以就正常。

可为什么是递归呢?哪有递归函数的调用啊,我是菜鸟
姐姐讲清楚点啊。谢谢了!
[/Quote]
耍宝王 2010-04-13
  • 打赏
  • 举报
回复
ostream &operator<<(ostream &cout, string &aa)//不会递归,因为aa + "111"会产生一个临时变量而string&不能绑定临时变量,应此cout<< aa + "111" << endl;语句最终是调用原版的(STL定义的)ostream &operator<<(ostream &cout, const string &aa),所以能“正常”输出。

而ostream &operator<<(ostream &cout, string aa)不同,string aa可以使用临时变量初始化,因此,如LS所说发生无限递归,也就无法输出
superhard_d 2010-04-13
  • 打赏
  • 举报
回复
支持I/O操作的类所提供的I/O操作接口,一般应该与标准库Iostream为内置类型定义的接口相同。一般定义如下:

ostream&
operator << (ostream& os, const ClassType &object)
{
//...
os<< //...
return os;
}
某某9 2010-04-13
  • 打赏
  • 举报
回复
加&,避免复制aa。
白云飘飘飘 2010-04-13
  • 打赏
  • 举报
回复
假如有cout<<str,被编译器解释为:ostream operator<<(cout, str),VC下溢出,没有用过dev-c
ZangXT 2010-04-13
  • 打赏
  • 举报
回复

#include <cstdio>
ostream &operator<<(ostream &cout, string &aa)
{
printf("enter");//测试
cout<< aa + "111" << endl;
return cout;
}

sxj0384 2010-04-13
  • 打赏
  • 举报
回复
dev-c++4.9
sxj0384 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lhcwjy 的回复:]

不加时成了递归调用,最后堆栈溢出。
加&时库里本来就有这个定义,调用时先调用自定义的,在自定义的里面再调用库里定义的,所以就正常。
[/Quote]
可为什么是递归呢?哪有递归函数的调用啊,我是菜鸟
姐姐讲清楚点啊。谢谢了!
白云飘飘飘 2010-04-13
  • 打赏
  • 举报
回复
什么编译器?
sxj0384 2010-04-13
  • 打赏
  • 举报
回复
但是string &aa可以返回正确的结果的。输出为:
test 111
但为什么改为string aa就输出一片空白呢?
白云飘飘飘 2010-04-13
  • 打赏
  • 举报
回复
不加时成了递归调用,最后堆栈溢出。
加&时库里本来就有这个定义,调用时先调用自定义的,在自定义的里面再调用库里定义的,所以就正常。
ZangXT 2010-04-13
  • 打赏
  • 举报
回复
ostream &operator<<(ostream &cout, string &aa)
{
cout<< aa + "111" << endl; //调用自己
return cout;
}
ZangXT 2010-04-13
  • 打赏
  • 举报
回复
加不加都是不正确的。
递归了。

64,654

社区成员

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

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