您的位置:首页 > 其它

运算符-重载为成员函数 和友元函数的区别.

2011-08-01 21:56 295 查看
下面的代码有无错误? 为什么?

class A
{
public:
A(){x=0;}
A(int _x):x(_x){}
//friend A operator + (const A& a1, const A& a2 )
//{
// return A(a1.x + a2.x);
//}
A operator + (const A &a1)
{
return A(x + a1.x);
}
int x;
};
using namespace std;

void testA( const A& a1, const A& a2)
{
A a3 = a1 + a2;
}

答案是:

上面的代码编译不过去.

因为: testA的传进的两个参数有const修饰, 所以 A a3 = a1 + a2; 将尝试调用 A operate + (const A& a1, const A& a2
). 注意, 第一个参数a1有const修饰.

而 A类内部重载的 operate + (const A &a1) 底层上表现为 A operate + ( A
& a1, const A& a2 ). 注意, 第一个参数, 没有const修饰.

所以编译不过去.

通过 恢复 被注释掉的代码. 才可以编译过去.

如果同时定义

内部成员函数 A operate + ( A & a1, A& a2 ).

外部友元函数 friend operate + ( A & a1, A& a2 ). 编译时, 将报错, 函数模糊. 因为两者底层上是一样的! 没法实现函数重载

重载规则:

一般情况下: 单目算符重载为成员函数, 双目算符重载为友元. 而且重载其一即可.

若有 双目算符, 函数内部要修改成员变量啥的, 可以重载为成员函数.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: