C++运算符重载
2013-06-06 23:22
316 查看
在运算符重载运用时应该注意以下几个问题:(1)C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符;(2)C++中绝大部分的运算符可重载,除了成员访问运算符.,成员指针访问运算符.*,作用域运算符::,长度运算符sizeof以及条件运算符?:;(3)重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符;(4)重载不能改变运算符原有的优先级;(5)重载不能改变运算符原有结合的特性。比如:z=x/y*a,执行时是先做左结合的运算x/y,重载后也是如此,不会变成先做右结合y*a;(6)运算符重载不能全部是C++中预定义的基本数据,这样做的目的是为了防止用户修改用于基本类型数据的运算符性质;(7)从上述的示例中可以看到双目运算符可以被重载为友元函数也可以重载为成员函数,但有一种情况,只能使用友元函数,是什么情况呢?我举个例子:
如果我们把上述main()主函数实现部分里的total=com1+5改为total=5+com1;那么程序就会报错(没有与这些操作数匹配的 "+" 运算符),因为左操作数5不是该复数类的对象,不能调用相应的成员函数Complex operator+(int x),所以编译错误。但如果我们定义一下两个友元函数就能解决上述的问题:
friend Complex operator+(Complex com1,int x);
friend Complex operator+(int x,Complex com1);
3.最后还是一样,我将用一个示例来总结一下今天所讲的内容(开发工具:vs2010):
结果:
class Complex //复数类 { private://私有 double real;//实数 double imag;//虚数 public: Complex(double real=0,double imag=0) { this->real=real; this->imag=imag; } Complex operator+(int x); }; Complex Complex::operator+(int x) { return Complex(real+x,imag); } int main() { Complex com1(5,10),total; total=com1+5; return0; }
如果我们把上述main()主函数实现部分里的total=com1+5改为total=5+com1;那么程序就会报错(没有与这些操作数匹配的 "+" 运算符),因为左操作数5不是该复数类的对象,不能调用相应的成员函数Complex operator+(int x),所以编译错误。但如果我们定义一下两个友元函数就能解决上述的问题:
friend Complex operator+(Complex com1,int x);
friend Complex operator+(int x,Complex com1);
3.最后还是一样,我将用一个示例来总结一下今天所讲的内容(开发工具:vs2010):
View Code #include "stdafx.h" #include <iostream> class Complex //复数类 { private://私有 double real;//实数 double imag;//虚数 public: Complex(double real=0,double imag=0) { this->real=real; this->imag=imag; } Complex operator+(Complex com1);//成员函数重载双目运算符+ //或friend Complex operator+(Complex com1,Complex com2);//友元函数重载双目运算符+ friend Complex operator+(Complex com1,int x);//友元函数重载双目运算符+ //或Complex operator+(int x); friend Complex operator+(int x,Complex com1);//友元函数重载双目运算符+ void showSum(); }; Complex Complex::operator+(Complex com1) { return Complex(real+com1.real,imag+com1.imag); } Complex operator+(Complex com1,int x)//左操作数类型为复数,右操作数的类型为整数 { return Complex(com1.real+x,com1.imag); } Complex operator+(int x,Complex com1)//左操作数类型为整数,右操作数的类型为复数 { return Complex(x+com1.real,com1.imag); } void Complex::showSum() { std::cout<<real; if(imag>0) std::cout<<"+"; if(imag!=0) std::cout<<imag<<"i"<<std::endl; } class Point//坐标类 { private: int x; int y; public: Point(int x,int y) { this->x=x; this->y=y; } friend voidoperator++(Point& point);//友元函数重载单目运算符++ Point operator++();//成员函数重载双目运算符++ void showPoint(); }; voidoperator++(Point& point)//友元运算符重载函数 { ++point.x; ++point.y; } Point Point::operator++() { ++x; ++y; return*this;//返回当前对象 } void Point::showPoint() { std::cout<<"("<<x<<","<<y<<")"<<std::endl; } int main() { //两个复数相加 std::cout<<"两个复数相加:"<<std::endl; Complex com1(10,10),com2(20,-20),sum; sum=com1+com2;//或sum=com1.operator+(com2) std::cout<<"(10+10i)+(20-20i)="; sum.showSum();//输出复数相加结果 //三个复数相加 std::cout<<"三个复数相加:"<<std::endl; sum=com1+com2+com2; std::cout<<"(10+10i)+(20-20i)+(20-20i)="; sum.showSum(); //整数和复数相加 std::cout<<"整数和复数相加:"<<std::endl; Complex com3(5,10),total; total=com3+5;//或total=operator+(com1,5); std::cout<<"(5+10i)+5="; total.showSum(); total=5+com3;//或total=operator+(5,com1); //只能用友元函数来重载运算符 std::cout<<"5+(5+10i)="; total.showSum(); //单目运算符++重载 std::cout<<"单目运算符++重载:"<<std::endl; //注意:下述实现部分不能只用一个++point会造成二义性 Point point(10,10); //调用友元函数 operator++(point);//或++point std::cout<<"调用友元函数:++(10,10)="; point.showPoint();//输出坐标值 //调用成员函数 point=point.operator++();//或++point; std::cout<<"调用成员函数:++(10,10)="; point.showPoint(); return0; }
结果: