设为首页 加入收藏

TOP

1.2.5 重载运算符的相关问题
2013-10-07 00:17:29 来源: 作者: 【 】 浏览:62
Tags:1.2.5 重载 运算 符的 相关 问题

1.2.5  重载运算符的相关问题

注意,被重载的运算符要保持原有的优先级和结合律,保持原有的使用习惯。例如赋值运算符“=”,运算符左边必须是变量,返回值是该变量的引用。例如程序段:

int a=0,b=4;
int &c=(a=b);
printf("return  value is %d\n",c);
a=6;  //因为c是a的引用,所以c的值也被改变
printf("c=%d\n",c);
}
输出结果:
return value is 4
c=6

所以应该如下例所示,重载赋值运算符。
  class CAdd
{
public:
CAdd()
{ m_Operand=0;
}
CAdd(int value)
{
m_Operand=value;
}
CAdd&  operator = (const int aa)
{
m_Operand=aa;
return *this;
}
CAdd&  operator = (const CAdd aa)
{
m_Operand=aa.m_Operand;
return *this;
}
private:
int m_Operand;
};

又如“+”运算符,如果a+b成立,同时b+a不成立,就会让人质疑。请看示例1.7。

示例清单1.7

 #include "stdio.h"
class CAdd
{
public:
CAdd()
{
m_Operand=0;
}
CAdd(int value)
{
m_Operand=value;
}
CAdd operator +(int b)
{
CAdd  sum;
sum.m_Operand= m_Operand +b;
return sum;
}
int GetValue()const
{  
return m_Operand;
}

private:
int m_Operand;
};
int main(int argc, char* argv[])
{
CAdd a(3),b;
b=a+4;
printf("%d\n", b.GetValue());
return 0;
}
程序输出结果:
7
示例1.7中,如果主函数的调用语句不是b=a+4,而是b=4+a,程序会产生编译错误。因为前者被编译器解释为b=a.operator+(4),后者被解释为b=4.operator+(a)。解决这个问题只需增加一个重载函数:
 CAdd friend operator +(int a,CAdd b)
{
CAdd c;
c.m_Operand=a+b.m_Operand;
return c;
}

许多运算符的重载都有各自的特点,下面略作说明,不一一详述。

后缀运算符增加一个int型参数。例如:

 CAdd& CAdd:: operator--(int s)
{
m_Operand--;
return *this;
}
int main(int argc, char* argv[])
{
CAdd a(5);
a--;
printf("%d\n",a.m_Operand);
return 0;
}

输出结果4。
 
=、()(函数调用运算符)、[]、->、只能重载为非静态的成员函数。
 
=运算符被子类继承后,不可以直接调用,调用时要加基类的标识符进行限定,例如示例1.8。
 
类型转换运算符没有返回值,例如operator int ()、operator char()等。

示例清单1.8

#include "stdio.h"
class CBase
{
public:
CBase(){m_iValue=0;}
CBase& operator =(int v)
{
m_iValue=v;
return *this;
}
int Get_iValue()const
{  return m_iValue;}
void Set_iValue(int v)
{  m_iValue=v; }
private:
int m_iValue;
};
class CSon :public CBase
{
public:
CSon(){m_fValue=0.0;}
CSon& operator =(const CSon& son)
{
CBase::operator=(son);//调用基类的赋值操作,保证基类成员被正确赋值
m_fValue=son.m_fValue;
return *this;
}
float Get_fValue()const
{  return m_fValue;}
void Set_fValue(float v)
{
m_fValue=v;
}
private:
float m_fValue;
};
int main(int argc, char* argv[])
{
CSon son1,son2;
/*以下两行语句都是非法调用
son2=34;
son2.operator =(34);
*/
//下面是正确调用从基类继承的赋值运算符的格式
son2.CBase::operator =(34);
son2.Set_fValue((float)21.33);
son1=son2;
printf("%8.2f  %d\n",son1.Get_fValue(),son1.Get_iValue());
return 0;
}
程序输出结果是:21.33  34。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.3 函数重载在MFC中的应用举例 下一篇1.2.2 运算符重载的特点

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: