关于输入输出操作符重载的一点疑问?

yiruirui0507 2010-11-21 02:32:48
class A;
ostream& operator<<(ostream &os,A &a);
class A
{
friend ostream& operator<<(ostream &os,A &a);
int a;
public:
A(int x){a=x;}
~A(){}
};
ostream operator<<(ostream &os,A &a)
{
os<<a.a<<endl;
return os;
}
int main()
{
A a(78);
cout<<a<<endl;
return 0;
}
在VC 6.0下写的,我想知道为什么必须返回引用,我这样就编译出错?麻烦大家给出解释,谢谢!
...全文
265 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-11-22
  • 打赏
  • 举报
回复
又见语法糖
yiruirui0507 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhao4zhong1 的回复:]
又见语法糖
[/Quote]

语法糖?那你说说原因呗,人家说不能复制就不能?难道不应该考虑考虑原因吗?过于机械化那干脆别学了,
liutengfeigo 2010-11-21
  • 打赏
  • 举报
回复
第一,流对象不可以复制。
滴2,假如你不返回一个流对象你cout<<a 后 ,后面的endl怎么办?
~VC6确实不该用了,除非你在工作。
jikeyuan1 2010-11-21
  • 打赏
  • 举报
回复
VC 6.0的流的重载时要再类中定义的,不然就报错 LZ 还是换VC2008吧
引用一般都是为了不产生对象的副本,而且流好像是不可以复制吧 嘿嘿
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
流对象不让拷贝,其他的不知道了.
yiruirui0507 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gules 的回复:]
很简单,C++标准库禁止外部进行输入输出流的拷贝(效率原因),你要觉得不合理就不用这个库吧。
[/Quote]

效率原因?对这个问题你还能说出来多少?劝说出来吧!OK?
yiruirui0507 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gules 的回复:]
很简单,C++标准库禁止外部进行输入输出流的拷贝(效率原因),你要觉得不合理就不用这个库吧。
[/Quote]

private:
__CLR_OR_THIS_CALL basic_ios(const _Myt&); // not defined
_Myt& __CLR_OR_THIS_CALL operator=(const _Myt&); // not defined

_Mysb *_Mystrbuf; // pointer to stream buffer
_Myos *_Tiestr; // pointer to tied output stream
_Elem _Fillch; // the fill character
};

应该就是这里吧?
gules 2010-11-21
  • 打赏
  • 举报
回复
很简单,C++标准库禁止外部进行输入输出流的拷贝(效率原因),你要觉得不合理就不用这个库吧。
yiruirui0507 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gules 的回复:]
引用 7 楼 yiruirui0507 的回复:
引用 6 楼 gules 的回复:
不返回引用,就会拷贝cout,这是你想要的吗?


能给点合理的解释吗?拷贝cout就拷贝cout,问题是编译都通不过。。。。


这个解释不合理?拷贝就拷贝,你说的轻松,ostream类允许拷贝吗?
[/Quote]
你能不能说具体点清楚点呢,为什么不允许拷贝?
就是因为他把拷贝构造函数放到了PRIVATE中吗?如果是为什么要这么做?有什么优点吗?不是又是什么情况?谢谢你!
shangyangi 2010-11-21
  • 打赏
  • 举报
回复
友元声明与函数定义问题
  • 打赏
  • 举报
回复
。。。
看看输出流里面的东西,如果不反悔引用,那么流就会复制一份...
gules 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yiruirui0507 的回复:]
引用 6 楼 gules 的回复:
不返回引用,就会拷贝cout,这是你想要的吗?


能给点合理的解释吗?拷贝cout就拷贝cout,问题是编译都通不过。。。。
[/Quote]

这个解释不合理?拷贝就拷贝,你说的轻松,ostream类允许拷贝吗?
yiruirui0507 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gules 的回复:]
不返回引用,就会拷贝cout,这是你想要的吗?
[/Quote]

能给点合理的解释吗?拷贝cout就拷贝cout,问题是编译都通不过。。。。
gules 2010-11-21
  • 打赏
  • 举报
回复
不返回引用,就会拷贝cout,这是你想要的吗?
yiruirui0507 2010-11-21
  • 打赏
  • 举报
回复
感谢大家的提醒:

class A
{
friend ostream operator<<(ostream &os,A &a);
int a;
public:
A(int x){a=x;}
~A(){}
};
ostream operator<<(ostream &os,A &a)
{
os<<a.a<<endl;
return os;
}
int main()
{
A a(78);
cout<<a<<endl;
return 0;
}

我想知道为什么必须返回引用?
gules 2010-11-21
  • 打赏
  • 举报
回复
即使输出重载的定义改正确了: ostream& operator<<(ostream &os,A &a),VC6.0下编译还可能出错,因此VC6对友元的支持不好!
  • 打赏
  • 举报
回复
ostream& operator<<(ostream &os,A &a);//去掉类外的这个
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
ostream& operator<<(ostream &os,const A &a);

class A
{
friend ostream& operator<<(ostream &os,const A &a);
public:
A(int x):a(x)
{

}

~A()
{

}

private:
int a;
};

ostream& operator<<(ostream &os,const A &a)
{
os<<a.a<<endl;
return os;
}

int main()
{
A a(78);
cout<<a<<endl;
return 0;
}
qq120848369 2010-11-21
  • 打赏
  • 举报
回复
楼主,友元声明与函数定义不服啊.

65,211

社区成员

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

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