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); } |
输出结果:
所以应该如下例所示,重载赋值运算符。
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; }
|
程序输出结果:
示例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】