由于系统给定的+,-,*,/符号只能用来处理系统已经定义好的比如int,float类型的类,因此我们想同样用+,-,*,/符号来处理我们自己定义的类就需要在类中进行运算符的重载。
重载运算符后我们便可以随心所欲的用运算符处理我们自己定义的类
复数类的类定义为:
class Complex
{
public:
Complex(double real=0, double imag=0);
//重载+,-,*,/
Complex& operator+(Complex& cox_num2);
Complex& operator-(Complex& cox_num2);
Complex& operator*(Complex& cox_num2);
Complex& operator/(Complex& cox_num2);
//输出复数类
void display();
private:
//实部
double real;
//虚部
double imag;
};
由于无论是加减乘除我们都要让我们重载的符号能满足类型于a+b+c这样的操作,所以要让a+b返回的值还能加c,所以我们在调用运算符后返回的值应该还是一个Complex类型的对象,因此加减乘除运算符返回的类型都为Complex&。
加减乘除运算都是需要两个变量的运算,而我们只传入了一个参数,这是为什么呢,因为我们这是在类中定义的成员函数,所以在运算符左边的对象就是调用这个运算符的对象,比如我们运算两个Complex的对象p1和p2,我们重载运算符后运用p1+p2,此时在+号左边的p1就是调用operator+函数的对象,而在+号右边的便是传入operator+函数的参数。
我们重载运算符的格式就是 函数类型 operator+运算符名称(参数1,参数2)
1.重载 +
//重载 +
Complex& Complex::operator+(Complex& cox_num2)
{
Complex cox_num3;
cox_num3.real= real + cox_num2.real;
cox_num3.imag = imag + cox_num2.imag;
return cox_num3;
}
2.重载 -
//重载 -
Complex& Complex::operator-(Complex& cox_num2)
{
Complex cox_num3;
cox_num3.real = real - cox_num2.real;
cox_num3.imag = imag - cox_num2.imag;
return cox_num3;
}
3.重载 *
//重载 *
Complex& Complex::operator*(Complex& cox_num2)
{
Complex cox_num3;
cox_num3.real = real * cox_num2.real - imag * cox_num2.imag;
cox_num3.imag = real * cox_num2.imag + cox_num2.real * imag;
return cox_num3;
}
4.重载 /
//重载 /
Complex& Complex::operator/(Complex& cox_num2)
{
Complex cox_num3;
cox_num3.real = (real * cox_num2.real + imag * cox_num2.imag) / (cox_num2.real * cox_num2.real + cox_num2.imag * cox_num2.imag);
cox_num3.imag=(cox_num2.real*imag-real*cox_num2.imag)/ (cox_num2.real * cox_num2.real + cox_num2.imag * cox_num2.imag);
return cox_num3;
}
重载好运算符后我们便可以在建立两个对象后正常使用了
比如:
Complex num1(2, 4);
Complex num2(3, 5);
Complex num3=num1+num2;