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

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下写的,我想知道为什么必须返回引用,我这样就编译出错?麻烦大家给出解释,谢谢!
...全文
223 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
楼主,友元声明与函数定义不服啊.
Perl 5 教程 by flamephoenix 第一部分 Perl语言 第一章 概述 一、Perl是什么? 二、Perl在哪里? 三、运行 四、注释 第二章 简单变量 一、整型 二、浮点数 三、字符串 第三章 操作符 一、算术操作符 二、整数比较操作符 三、字符串比较操作符 四、逻辑操作符 五、位操作符 六、赋值操作符 七、自增自减操作符 八、字符串联结和重复操作符 九、逗号操作符 十、条件操作符 十一、操作符的次序 第四章 列表和数组变量 一、列表 二、数组--列表的存贮 1、数组的存取 2、字符串中的方括号和变量替换 3、列表范围 4、数组的输出 5、列表/数组的长度 6、子数组 7、有关数组的库函数 第五章 文件读写 一、打开、关闭文件 二、读文件 三、写文件 四、判断文件状态 五、命令行参数 六、打开管道 第六章 模式匹配 一、简介 二、匹配操作符 三、模式中的特殊字符 1、字符 + 2、字符 []和[^] 3、字符 *和? 4、转义字符 5、匹配任意字母或数字 6、锚模式 7、模式中的变量替换 8、字符范围转义前缀 9、匹配任意字符 10、匹配指定数目的字符 11、指定选项 12、模式的部分重用 13、转义和特定字符的执行次序 14、指定模式定界符 15、模式次序变量 四、模式匹配选项 1、匹配所有可能的模式(g选项) 2、忽略大小写(i选项)例 3、将字符串看作多行(m选项) 4、只执行一次变量替换例 5、将字符串看作单行例 6、在模式中忽略空格 五、替换操作符 六、翻译操作符 七、扩展模式匹配 1、不存贮括号内的匹配内容 2、内嵌模式选项 3、肯定的和否定的预见匹配 4、模式注释 第七章 控制结构 一、条件判断 二、循环: 1、while循环 2、until循环 3、for循环 4、针对列表(数组)每个元素的foreach循环 5、do循环 6、循环控制 7、传统的goto语句 三、单行条件 第八章 子程序 一、定义 二、调用 1、用&调用 2、先定义后调用 3、前向引用 4、用do调用 三、返回值 四、局部变量 五、子程序参数传递 1、形式 2、传送数组 六、递归子程序 七、用别名传递数组参数 八、预定义的子程序 第九章 关联数组(哈希表) 一、数组变量的限制 二、定义 三、访问关联数组的元素 四、增加元素 五、创建关联数组 六、从数组变量复制到关联数组 七、元素的增删 八、列出数组的索引和值 九、用关联数组循环 十、用关联数组创建数据结构 1、(单)链表 2、结构 3、树 第十章 格式化输出 一、定义打印格式 二、显示打印格式 三、在打印格式中显示值 1、通用的打印格式 2、格式和局域变量 3、选择值域格式 4、输出值域字符 四、输出到其它文件 五、分页 六、格式化长字符串 七、用printf格式化输出 第十一章 文件系统 一、文件输入/输出函数 1、基本I/O函数 1)open函数 2)用open重定向输入 3)文件重定向 4)指定读写权限 5)close函数 6)print, printf和write函数 7)select函数 8)eof函数 9)间接文件变量 2、跳过和重读数据 3、系统读写函数 4、用getc读取字符 5、用binmode读取二进制文件 二、目录处理函数 1、mkdir 2、chdir 3、opendir 4、closedir 5、readdir 6、telldir 7、seekdir 8、rewinddir 9、rmdir 三、文件属性函数 1、文件重定位函数 2、链接和符号链接函数 3、文件许可权函数 4、其他属性函数 四、使用DBM文件 第十二章 Perl5中的引用(指针) 一、引用简介 二、使用引用 三、使用反斜线(\)操作符 四、引用和数组 五、多维数组 六、子程序的引用 子程序模板 七、数组与子程序 八、文件句柄的引用 第十三章 Perl的面向对象编程 一、模块简介 二、Perl中的类 三、创建类 四、构造函数 .实例变量 五、方法 六、方法的输出 七、方法的调用 八、重载 九、析构函数 十、继承 十一、方法的重载 十二、Perl类和对象的一些注释 第十四章 Perl5的包和模块 一、require函数 1、require函数和子程序库 2、用require指定Perl版本 二、包 1、包的定义 2、在包间切换 3、main包 4、包的引用 5、指定无当前包 6、包和子程序 7、用包定义私有数据 8、包和系统变量 9、访问符号表 三、模块 1、创建模块 2、导入模块 3、预定义模块 附录一 函数集 一、进程处理函数 1、进程启动函数 2、进程终止函数 3、进程控制函数 4、其它控制函数 二、数学函数 三、字符串处理函数 四、标量转换函数 五、数组和列表函数 六、关联数组函数 第二部分 Perl的CGI应用 第一章 cgilib例 第二章 动态创建图像 Copyright: 本教程为flamephoenix翻译整理,欢迎参观我的主页http://flamephoenix.126.com。 本教程欢迎下载、转载和链接,转载必须保留本说明并保持文章完整。本教程不允许以任何形式用于商业用途。 对本教程有何疑问、更正或建议请告诉我,谢谢。 flamephoenix

65,184

社区成员

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

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