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

为什么有些运算符重载不能重载为友元函数

rwyangguang 发布于 2010-06-02 19:20, 4331 次点击
有些运算符  如 :=,[]不能重载用友元重载    为什么    帮忙解释下如何区分用友元还成员重载
5 回复
#2
2010-06-02 20:25
前面的问题,不知道。后面的,友元就是friend声明的函数)(不属于类的),运算符的参数的个数不变。成员函数就是属于类的。运算符的参数的个数少一个。
#3
南国利剑2010-06-02 20:31
这是规则,我们只能遵守游戏规则了。
#4
又见江南2010-06-02 20:56
前面的问题是C++语法规定的
#5
lijm19892010-06-02 22:09
第一个问题:
    很难解释,例如说是为了安全机制(混淆底层)、防止二义性、重载没多大用 (@!@)... ...
    说白了就是LS们说的规则问题,很多时候专牛角尖挺好,但有的时候只需知道就好,想多了自己头痛。
第二个问题:
    (摘自网上)
(1) 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。

(2) 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。

(3) 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。

(4) 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。

(5) 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。

(6) 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。

#6
gaoce2272010-06-05 15:31
楼上正解。具体参考谭老师的《C++程序设计》,别钻牛角尖!!!

要点说明:
按照类的封装,一般声明为成员函数,但在双目运算符中,如果左右两侧的操作数不是属于同个类的两个对象,那么就完蛋了。这可能是双目一般用友元重载的因素之一。

[ 本帖最后由 gaoce227 于 2010-6-5 15:36 编辑 ]
1