C++运算符重载:为什么流运算符不能重载为成员函数?
想知道为何流运算符<<和>>不能重载为类的成员函数,而必须声明为友元函数?知道的朋友请详细解释一下,感激不尽……...
想知道为何流运算符<<和>>不能重载为类的成员函数,而必须声明为友元函数?知道的朋友请详细解释一下,感激不尽……
展开
3个回答
展开全部
试想一下这一点:
将我们的类派生于ostream,也就是做为流类的子类,这样,不就可以将插入运算符声明为成员函数,并且用法也与友元方式下一样了吗?
那么为什么还要声明为友元呢?原因上面回答者也说了一些。。。
不能重载的根本原因在于,
大部份的标准库实现中,对ostream,istream类体系采用了构造函数保护继承的方式。。。致使即使以继承的方式来扩展流类,也会在对象实例化时遭遇阻碍。。。
另一方面,标准库中的流类,其插入符函数没有声明为虚函数,因此子类不能对其实现进行覆盖,所以也使成员函数重载遭遇到实质的困难。。。
总的来说,C++标准I/O库非常繁杂且难,其实现思想很多都与常规的OOP有所出入。。。在使用的时候要谨慎,并最好遵从惯例。。。
将我们的类派生于ostream,也就是做为流类的子类,这样,不就可以将插入运算符声明为成员函数,并且用法也与友元方式下一样了吗?
那么为什么还要声明为友元呢?原因上面回答者也说了一些。。。
不能重载的根本原因在于,
大部份的标准库实现中,对ostream,istream类体系采用了构造函数保护继承的方式。。。致使即使以继承的方式来扩展流类,也会在对象实例化时遭遇阻碍。。。
另一方面,标准库中的流类,其插入符函数没有声明为虚函数,因此子类不能对其实现进行覆盖,所以也使成员函数重载遭遇到实质的困难。。。
总的来说,C++标准I/O库非常繁杂且难,其实现思想很多都与常规的OOP有所出入。。。在使用的时候要谨慎,并最好遵从惯例。。。
展开全部
class object如果实现了成员operator<< ,调用其对象格式o<<cout; 是不是很乱。重载运算符为成员函数后,当调用该运算符时,左操作数必须是该类的实例。友元函数 流参数定义第一个参数.才能调用cout<<obj;而成员函数流参数不是第一个参数,调用时应该是obj<<cout;
虽然不能“重载”为成员函数,但是可以定义为新的成员函数,只不过使用习惯和常例不符而已。
虽然不能“重载”为成员函数,但是可以定义为新的成员函数,只不过使用习惯和常例不符而已。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
class T;
T t;
成员的话,得这么用了
t<<cout;
而不是
cout<<t
而且也无法链式使用了
cout<<t<<t<<t<<endl;
T t;
成员的话,得这么用了
t<<cout;
而不是
cout<<t
而且也无法链式使用了
cout<<t<<t<<t<<endl;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询