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

来源:互联网 发布:蓝格美容院软件 编辑:程序博客网 时间:2024/05/21 22:44

下面的代码有无错误? 为什么?

  1. class A
  2. {
  3. public:
  4.     A(){x=0;}
  5.     A(int _x):x(_x){}
  6.     //friend A  operator + (const A& a1, const A& a2 ) 
  7.     //{ 
  8.     //  return A(a1.x + a2.x); 
  9.     //} 
  10.     A operator + (const A &a1)
  11.     {
  12.         return A(x + a1.x);
  13.     }
  14.     int x;
  15. };
  16. using namespace std;
  17. void testA(  const A& a1,  const A& a2)
  18. {
  19.     A a3 = a1 + a2;
  20. }

答案是:

上面的代码编译不过去. 
因为: 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  ).   编译时, 将报错, 函数模糊. 因为两者底层上是一样的! 没法实现函数重载


重载规则:

一般情况下: 单目算符重载为成员函数, 双目算符重载为友元. 而且重载其一即可.
若有 双目算符, 函数内部要修改成员变量啥的, 可以重载为成员函数.

原创粉丝点击