第三十一课 复数类
一、复数类的操作符
-
运算
+、-、*、/
-
比较
==、!=
-
赋值
=
-
求模
modulus
二、目的
- 利用操作符的重载统一复数的实数运算方式以及实数的比较方式
做一个复数类
complex.h
#ifndef __COMPLEX_H_
#define __COMPLEX_H_
class complex
{
private:
/* data */
double a;
double b;
public:
complex(double a = 0, double b = 0);
~complex();
double getA(void);
double getB(void);
double getModulus(void);
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
complex.c
#include "complex.h"
#include <math.h>
complex::complex(double a, double b)
{
this->a = a;
this->b = b;
}
double complex::getA(void)
{
return a;
}
double complex::getB(void)
{
return b;
}
double complex::getModulus(void)
{
return sqrtf(a * a + b * b);
}
complex complex::operator + (const complex& c)
{
complex ret;
ret.a = a + c.a;
ret.b = b + c.b;
return ret;
}
complex complex::operator - (const complex& c)
{
complex ret;
ret.a = a - c.a;
ret.b = b - c.b;
return ret;
}
complex complex::operator * (const complex& c)
{
complex ret;
ret.a = a * c.a - b * c.b;
ret.b = b * c.a + a * c.b;
return ret;
}
complex complex::operator / (const complex& c)
{
complex ret;
ret.a = (a * c.a + b * c.b) / (c.a * c.a + c.b * c.b);
ret.b = (b * c.a - a * c.b) / (c.a * c.a + c.b * c.b);
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;
}
complex::~complex()
{
}
test.c
#include "complex.h"
#include <stdio.h>
int main()
{
complex t1(1, 2);
complex t2(3, 4);
complex t3 = t2 + t1;
printf("%f %f\n", t3.getA(), t3.getB());
}
执行结果
4.000000 6.000000
三、注意事项
- C++ 规定的赋值操作符(=)只能重载为成员函数
- 操作符重载不能改变原操作符的优先级
- 操作符重载不能改变操作数的个数
- 操作符重载不应改变操作符的原有语义
四、小结
- 复数的概念可以通过自定义类实现
- 复数的运算操作可以通过操作符重载实现
- 赋值操作符只能通过成员函数实现
- 操作符重载的本质为函数定义