运算符-重载为成员函数 和友元函数的区别.
2008-11-12 12:29
351 查看
下面的代码有无错误? 为什么?
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 ). 编译时, 将报错, 函数模糊. 因为两者底层上是一样的! 没法实现函数重载
重载规则:
一般情况下: 单目算符重载为成员函数, 双目算符重载为友元. 而且重载其一即可.
若有 双目算符, 函数内部要修改成员变量啥的, 可以重载为成员函数.
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 ). 编译时, 将报错, 函数模糊. 因为两者底层上是一样的! 没法实现函数重载
重载规则:
一般情况下: 单目算符重载为成员函数, 双目算符重载为友元. 而且重载其一即可.
若有 双目算符, 函数内部要修改成员变量啥的, 可以重载为成员函数.
相关文章推荐
- 运算符-重载为成员函数 和友元函数的区别.
- 成员函数和友元函数完成一元运算符重载
- 第八周任务1:方案二:请用类的友元函数,而不是成员函数,完成上面提及的运算符的重载;
- 第七周 项目二:成员函数、友元函数、一般函数之区别(初体验)
- 第七周项目一友元函数、成员函数和一般函数的区别
- 友元函数,成员函数,普通函数的区别
- 成员函数,友元函数和一般函数的区别
- 第七周项目二----一般函数,友元函数,成员函数的区别
- 从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载
- 第七周项目一 (成员函数,友元函数和一般函数的区别)
- 第七周 项目1-成员函数、友元函数和一般函数有区别(1)一般
- 第7周项目1(2)成员函数、一般函数和友元函数的区别
- 第七周项目一-成员函数、友元函数和一般函数有区别(1)
- 第7周项目1:成员函数、友元函数和一般函数有区别(1)
- 类成员函数的重载、覆盖和隐藏区别?
- 项目1——体验成员函数、友元函数和一般函数的区别
- 第六周项目4:成员函数,友元函数和一般函数有区别
- 七周 项目3 成员函数,友元函数,和一般函数的区别
- 第五周项目 4 成员函数、友元函数和一般函数有区别
- 第6周项目4成员函数,友元函数和一般函数的区别