C++运算符重载:为什么流运算符不能重载为成员函数?

想知道为何流运算符<<和>>不能重载为类的成员函数,而必须声明为友元函数?知道的朋友请详细解释一下,感激不尽……... 想知道为何流运算符<<和>>不能重载为类的成员函数,而必须声明为友元函数?知道的朋友请详细解释一下,感激不尽…… 展开
 我来答
百度网友67496da
推荐于2018-04-11 · TA获得超过652个赞
知道小有建树答主
回答量:220
采纳率:0%
帮助的人:253万
展开全部
试想一下这一点:
将我们的类派生于ostream,也就是做为流类的子类,这样,不就可以将插入运算符声明为成员函数,并且用法也与友元方式下一样了吗?
那么为什么还要声明为友元呢?原因上面回答者也说了一些。。。
不能重载的根本原因在于,
大部份的标准库实现中,对ostream,istream类体系采用了构造函数保护继承的方式。。。致使即使以继承的方式来扩展流类,也会在对象实例化时遭遇阻碍。。。
另一方面,标准库中的流类,其插入符函数没有声明为虚函数,因此子类不能对其实现进行覆盖,所以也使成员函数重载遭遇到实质的困难。。。
总的来说,C++标准I/O库非常繁杂且难,其实现思想很多都与常规的OOP有所出入。。。在使用的时候要谨慎,并最好遵从惯例。。。
隔壁的虫子
2009-08-18 · TA获得超过1335个赞
知道小有建树答主
回答量:614
采纳率:0%
帮助的人:0
展开全部
class object如果实现了成员operator<< ,调用其对象格式o<<cout; 是不是很乱。重载运算符为成员函数后,当调用该运算符时,左操作数必须是该类的实例。友元函数 流参数定义第一个参数.才能调用cout<<obj;而成员函数流参数不是第一个参数,调用时应该是obj<<cout;

虽然不能“重载”为成员函数,但是可以定义为新的成员函数,只不过使用习惯和常例不符而已。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ivaniren
2009-08-18 · TA获得超过1471个赞
知道小有建树答主
回答量:1088
采纳率:0%
帮助的人:0
展开全部
class T;
T t;
成员的话,得这么用了
t<<cout;
而不是
cout<<t
而且也无法链式使用了
cout<<t<<t<<t<<endl;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式