注册 登录
编程论坛 C++教室

运算符重载

li_danwang 发布于 2010-12-30 08:16, 703 次点击
c++里面,为什么【】,(),=,->,这些运算符必须是成员函数重载,而流运算符,<<,>>这2个必须是友元函数重载???想不通,大哥大姐,指导指导。
6 回复
#2
小小哥2010-12-30 08:22
回复 楼主 li_danwang
同求……求大哥大姐知指点
#3
yangglemu2010-12-30 09:41
重载流操作符,通常将此操作符定义为类的友元函数(全局函数),否则类本身必须是istream和ostream的派生类,因为流操作符在输出时一般要访问类的私有成员,用友元还是派生,一目了然;另外在重载操作符时,还通常返回istream&/ostream&,而不是istream/ostream,因为在返回istream/ostrem时,要用到值拷贝函数,而输入输出流却没有提供值拷贝函数
#4
南国利剑2010-12-30 11:09
回复 楼主 li_danwang
比较一下他们的用途就知道了。
运算符只是要针对这个类的运算而已。
然而<< >>就不一样了,他还涉及输入输出流两个类。所以定义成友元函数比较合适。
#5
zgxyz20082010-12-30 21:11
"<<,>>"不是必须是友元函数重载,只是习惯而已,你只要看看我们在调用重载运算符是怎么调用的就知道了,如果我们将"<<,>>"定义类的成员,那么我们调用时左操作数只能为该类类型的对象,就要这样写:myclass item;item<<cout;很不习惯吧~如果要支持正常的用法,左操作数必须是Iostream对象,这意味着,如果该操作符是类的成员,则它必须是Iostream类的成员,但是Iostream是标准库的组成部分,我们不能为标准库中的类增加成员的。
#6
找工作中2011-01-02 13:29
以下是引用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;
}

这样可以避免声明一个友元。友元根本不该存在的
#7
makebest2011-01-02 22:42
运算符重载感觉就是奢侈品,能省就省省吧,不必如此计较.
1