C++提供了一种方法,可以使程序设计者按照不同的类型设计出不同的运算符功能。目的就是告诉编译器,当这个类型的对象使用此运算符时,就需要调用运算符重载函数。其实,运算符的重载是一种特殊的函数重载。
运算符重载函数通常为类的成员函数,既然是类的成员函数,就含有this指针。
其定义方式为:
返回值类型 类名:: operator紧跟需要重载的运算符(形参表);
operator是一个关键字
实例:复数的运算:
先看代码:
class Complex
{
private:
float Real;
float Image;
public:
Complex(float real=0.0f,float image=0.0f):Real(real),Image(image){}
Complex(const Complex& cp):Real(cp.Real),Image(cp.Image){}
~Complex(){}
Complex& operator=(const Complex& cp)
{
if (this != &cp)
{
Real = cp.Real;
Image = cp.Image;
}
return *this;
}
Complex operator+(const Complex& cp)
{
Complex tmp;
tmp.Real = Real + cp.Real;
tmp.Image = Image + cp.Image;
return tmp;
}
Complex operator*(const Complex& cp)
{
Complex tmp;
tmp.Real = Real*cp.Real-Image*cp.Image;
tmp.Image = Real*cp.Image+Image*cp.Real;
return tmp;
}
void Print()const
{
cout << Real << " + " << Image << "i " << endl;
}
};
int main()
{
Complex c1(2.3, 5.6);
Complex c2(-2.1, 6.0);
Complex c3;
c3 = c1 + c2;
cout << "c1+c2= ";
c3.Print();
c3 = c1 * c2;
cout << "c1*c2= ";
c3.Print();
return 0;
}
运行结果:
当编译器执行到加法运算时,会自己调用+的赋值运算符重载函数。当程序执行到乘法运算时,会自己调用乘法运算符的重载函数。这里就不写减法以及除法等等其他运算了。
赋值运算符的重载(=)如果没有写,编译器会提供一个按位拷贝的赋值运算符的重载函数。
当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个或(当为单目运算符时)没有。运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数。
单目运算符“++”和“-”存在前置与后置问题前置“++"格式为:
返回类型 类名::operator++()......}
而后置“++”格式为:
返回类型 类名::operator++(intX......]
后置“++”中的参数int仅用作区分,并无实际意义,可以给一个变量名,也可以不给变量名.
C++中只有极少数的的运算符不允许重载,其中包括:
三目运算符(?:)
成员操作符(. .*)
作用域解析符(::)
sizeof()运算符
注释符( // /* */ )
# ##也是不能够进行重载的
运算符重载有以下限制:
不可臆造新的运算符
不能改变运算符原有的优先级、结合性和语法结构,不能改变运算符操作数的个数
运算符重载不宜使用过多
重载运算符含义必须清楚,不能有二义性
下面都是可以进行重载的运算符