| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 703 人关注过本帖
标题:运算符重载
只看楼主 加入收藏
li_danwang
Rank: 4
来 自:鄂州
等 级:业余侠客
帖 子:112
专家分:203
注 册:2010-11-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
运算符重载
c++里面,为什么【】,(),=,->,这些运算符必须是成员函数重载,而流运算符,<<,>>这2个必须是友元函数重载???想不通,大哥大姐,指导指导。
搜索更多相关主题的帖子: 大哥 
2010-12-30 08:16
小小哥
Rank: 4
等 级:业余侠客
帖 子:139
专家分:224
注 册:2010-11-28
收藏
得分:5 
回复 楼主 li_danwang
同求……求大哥大姐知指点
2010-12-30 08:22
yangglemu
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:521
注 册:2006-9-15
收藏
得分:5 
重载流操作符,通常将此操作符定义为类的友元函数(全局函数),否则类本身必须是istream和ostream的派生类,因为流操作符在输出时一般要访问类的私有成员,用友元还是派生,一目了然;另外在重载操作符时,还通常返回istream&/ostream&,而不是istream/ostream,因为在返回istream/ostrem时,要用到值拷贝函数,而输入输出流却没有提供值拷贝函数

试着挣个威望!
2010-12-30 09:41
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:5 
回复 楼主 li_danwang
比较一下他们的用途就知道了。
运算符只是要针对这个类的运算而已。
然而<< >>就不一样了,他还涉及输入输出流两个类。所以定义成友元函数比较合适。

南国利剑
2010-12-30 11:09
zgxyz2008
Rank: 4
等 级:业余侠客
帖 子:67
专家分:202
注 册:2008-10-28
收藏
得分:5 
"<<,>>"不是必须是友元函数重载,只是习惯而已,你只要看看我们在调用重载运算符是怎么调用的就知道了,如果我们将"<<,>>"定义类的成员,那么我们调用时左操作数只能为该类类型的对象,就要这样写:myclass item;item<<cout;很不习惯吧~如果要支持正常的用法,左操作数必须是Iostream对象,这意味着,如果该操作符是类的成员,则它必须是Iostream类的成员,但是Iostream是标准库的组成部分,我们不能为标准库中的类增加成员的。
2010-12-30 21:11
找工作中
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:114
注 册:2008-5-21
收藏
得分:0 
以下是引用zgxyz2008在2010-12-30 21:11:41的发言:

"<<,>>"不是必须是友元函数重载,只是习惯而已,你只要看看我们在调用重载运算符是怎么调用的就知道了,如果我们将"<<,>>"定义类的成员,那么我们调用时左操作数只能为该类类型的对象,就要这样写:myclass item;item<
说得不错,其实operator<<之类的也不一定需要作为友元函数的:

class A
{
    istream& operator<<( istream& is ) const;
};

template<typename T>
istream& operator<<( istream& is, const T& t )
{
    return t << is;
}

这样可以避免声明一个友元。友元根本不该存在的

拿到工资先买个山寨手机
2011-01-02 13:29
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
收藏
得分:0 
运算符重载感觉就是奢侈品,能省就省省吧,不必如此计较.
2011-01-02 22:42
快速回复:运算符重载
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029565 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved