完善的复数类
复试地位在数学里是很高的
-
复数类应该具有的操作
- 运算:+,-,*,/
- 比较:== !=
- 赋值:=
- 求模:modulus
-
利用操作符重载
- 统一复数与实数的运算方式
- 统一于实数的比较方式
Complex operator + (const Cpmplex& c);
Complex operator - (const Cpmplex& c);
Complex operator * (const Cpmplex& c);
Complex operator / (const Cpmplex& c);
bool operator == (const Cpmplex& c);
bool operator != (const Cpmplex& c);
Complex& operator = (const Cpmplex& c);
完善的复数类代码
Complex.h
#ifndef _COMPLEX_H_
#define _COMPLEX_H_
class Complex
{
private:
double a;
double b;
public:
Complex(double a = 0, double b = 0);//函数声明时确定默认值,在cpp文件中实现时就不
//需要声明默认值
double getA();
double getB();
double getModulus();
Complex operator + (const Complex& p);
Complex operator - (const Complex& p);
Complex operator * (const Complex& p);
Complex operator / (const Complex& p);
bool operator == (const Complex& p);
bool operator != (const Complex& p);
Complex& operator = (const Complex& p);
};
#endif
Complex.cpp
#include "Complex.h"
#include "math.h"
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& p)
{
double na = this->a + p.a;
double nb = this->b + p.b;
Complex ret(na, nb);
return ret;
}
Complex Complex::operator - (const Complex& p)
{
double na = this->a - p.a;
double nb = this->b - p.b;
Complex ret(na, nb);
return ret;
}
Complex Complex::operator * (const Complex& p)
{
double na = this->a * p.a - this->b * p.b;
double nb = this->a * p.b + this->b * p.a;
Complex ret(na, nb);
return ret;
}
Complex Complex::operator / (const Complex& p)
{
double cm = p.a * p.a + p.b * p.b;
double na = (this->a * p.a + this->b * p.b) / cm;
double nb = (this->b * p.a - this->a * p.b) / cm;
Complex ret(na, nb);
return ret;
}
bool Complex::operator == (const Complex& p)
{
return ((this->a == p.a) && (this->b == p.b));
}
bool Complex::operator != (const Complex& p)
{
//这个实现方法非常巧妙,只需要他们相等的对立面
return !(*this == p);
}
Complex& Complex::operator = (const Complex& p)
{
if(this != &p)
{
this->a = p.a;
this->b = p.b;
}
return *this;
}
main.cpp
#include <iostream>
#include <string>
#include "Complex.h"
using namespace std;
int main(int argc, char *argv[])
{
Complex c1(1,2);
Complex c2(3,6);
Complex c3 = c2 - c1;
cout << "c3 = " << "(" << c3.getA() << ", " << c3.getB() << ")" <<endl;
Complex c4 = c1 * c3;
cout << "c4 = " << "(" << c4.getA() << ", " << c4.getB() << ")" <<endl;
Complex c5 = c2 / c1;
cout << "c5 = " << "(" << c5.getA() << ", " << c5.getB() << ")" <<endl;
Complex c6(2,4);
cout << "c3 == c6 : " << (c3 == c6) << endl;//这个(c3 == c6)是一定要加括号,
//因为 << 比 == 优先级高,但是复数类中又没有重载<<操作符,所以会报错
cout << "c3 == c4 : " << (c3 != c4) << endl;
(c3 = c2) = c1;
cout << "c1 = " << "(" << c1.getA() << ", " << c1.getB() << ")" <<endl;
cout << "c2 = " << "(" << c2.getA() << ", " << c2.getB() << ")" <<endl;
cout << "c3 = " << "(" << c3.getA() << ", " << c3.getB() << ")" <<endl;
return 0;
}
注意事项
- C++规定赋值操作符(=)只能重载为成员函数
- 操作符重载不能改变原操作符的优先级
- 操作符重载不能改变操作数的个数
- 操作符重载不能改变操作符的原有语义
小结
- 复数的概念可以通过自定义类实现
- 复数中的运算操作可以通过操作符重载实现
- 赋值操作符只能通过成员函数实现,是不能通过全局函数的
- 操作符重载的本质为函数定义
Alipay
Wechat