31、完善的复数类

#ifndef _COMPLEX_H_
#define _COMPLEC_H_
class Complex
{
private:
double a;
double b;
public:
Complex(double a=0, double b=0);
double getA();
double getB();
double getmodulus();
Complex operator + (const Complex& c);
Complex operator - (const Complex& c);
Complex operator * (const Complex& c);
Complex operator / (const Complex& c);


bool operator == (const Complex& c);
bool operator != (const Complex& c);


Complex& operator = (const Complex& c);  // 赋值操作符重载特殊之处:只能作为成员函数实现
};

#endif


#include "Complex.h"
#include<cmath>
Complex:: Complex(double a, double b)    //注意:构造函数使用了参数默认值方式,只能在函数声明的地方指定默认值,在函数定义的地方不需要指定默认值
{
this->a=a;
this->b=b;
}
double Complex::getA()
{
return a;
}
double Complex::getB()
{
return b;
}
double  Complex::getmodulus()
{
return sqrt(a*a+b*b);
}
Complex Complex::operator + (const Complex& c)
{
double na=a+c.a;
double nb=b+c.b;
Complex ret(na,nb);
return ret;
}
Complex Complex::operator - (const Complex& c)
{
double na=a-c.a;
double nb=b-c.b;
Complex ret(na,nb);
return ret;
}
Complex Complex::operator * (const Complex& c)
{
double na=a*c.a-b*c.b;
double nb=b*c.a+a*c.b;
Complex ret(na,nb);
return ret;
}
Complex Complex::operator / (const Complex& c)
{
double cm=c.a*c.a+c.b+c.b;
double na=(a*c.a+b*c.b)/cm;
double nb=(b*c.a-a*c.b)/cm;
Complex ret(na,nb);
return ret;
}


bool Complex::operator == (const Complex& c)
{
return (a==c.a)&&(b=c.b);
}
bool Complex::operator != (const Complex& c)
{
return !(*this==c);
}


Complex& Complex::operator = (const Complex& c)  // 赋值操作符重载特殊之处:只能作为成员函数实现
{
if( this !=&c )
{
a=c.a;
b=c.b;
}
return *this;                              // 对于赋值而言,他是可以进行连续赋值操作的,必须将左操作数直接返回

}


#include<iostream>
#include "Complex.h"
using namespace std;


int main()
{
Complex c1(1,2);
Complex c2(3,6);
Complex c3=c2-c1;
Complex c4=c1*c3;
Complex c5=c2/c1;


cout<<c3.getA()<<"  "<<c3.getB()<<endl;

cout<<c4.getA()<<"  "<<c4.getB()<<endl;

cout<<c5.getA()<<"  "<<c5.getB()<<endl;

Complex c6(2,4);
cout<<(c6==c3)<<endl;
cout<<(c6!=c4)<<endl;


(c3=c2)=c1;
cout<<c1.getA()<<"  "<<c1.getB()<<endl;
cout<<c2.getA()<<"  "<<c2.getB()<<endl;
cout<<c3.getA()<<"  "<<c3.getB()<<endl;
return 0;

}

注意事项:

c++规定赋值操作符(=)只能重载为成员函数

操作符重载不能改变原操作符的优先级

操作符重载不能改变操作数的个数

操作符重载不应改变操作符的原有语义。

操作符重载的本质为函数定义。

猜你喜欢

转载自blog.csdn.net/WS857707645/article/details/80226065