这几天在用C++写一个本专业相关的项目时,涉及到的频域信号是复数(s=a+bi),不是C++内置的数据类型,无法直接调用运算符进行计算,于是就自己写了一个复数类来实现了复数运算的相关功能。虽然C++标准库std中已经实现了complex类,包含头文件(#include < complex >)就可以直接调用,但是小编觉得复数类是学习C++运算符重载一个很好的案例,因为会涉及加、减、乘、除、相等、赋值等这些常见的运算符重载。接下来我们一起来学习一下运算符重载。
一、运算符重载概念引入
像上图的传递函数的求解公式,因为s是复数不是基本的内置数据类型,如果不用重载的运算符,需要程序员手推计算结果,且写入的代码将复杂很多且可读性差,但引入运算符重载之后,我们就直接在程序中写入公式就行了,编码简单、可读性强。因此,用术语描述运算符重载的原因就是:C++预定义中的运算符的操作对象只局限于内置数据类型,但是对于我们自定义的类进行运算操作是很麻烦的。为了对自定义的类对象进行类似的运算,就需要通过运算符重载重新定义某些运算符的含义,从而使我们的程序更易于编写和阅读。
运算符重载实质上也是多态,与虚函数实现多态不同的是,运算符重载在编译时就会确定使用的运算符类型,所以是静态多态。 运算符重载的形式为:
重载函数声明模板:
<返回的数据类型> operator <运算符符号> (参数);
重载函数定义模板:
<返回的数据类型> operator <运算符符号> (参数)
{
<重载的函数体>
}
二、自定义类运算符重载实现案例
自定义复数类实现运算符重载的代码如下:
#include<iostream>
using namespace std;
class Complex
{
public:
//默认构造函数
Complex();
//有参构造函数
Complex(double r,double i);
//返回复数的实部
double real();
//返回复数的虚部
double image();
//重载复数类的加号运算符
Complex operator+(const Complex& A);
//重载复数类的减号运算符
Complex operator-(const Complex& A);
//重载复数类的乘号运算符
Complex operator*(const Complex& A);
//重载复数类的除号运算符
Complex operator/(const Complex& A);
//重载复数类的赋值运算符
Complex& operator=(const Complex& A); //如果没有重载运算符,编译器会自动合成一个赋值运算符,功能相同
//重载复数类的等号运算符
bool operator==(const Complex& A);
//重载复数类的加等于运算符
Complex& operator+=(const Complex& A);
//重载复数类的减等于运算符
Complex& operator-=(const Complex& A);
//重载复数类的输出流运算符 非成员函数
friend ostream& operator<<(ostream &cout, const Complex& A); //友元函数,可以访问类中的非公有数据成员
private:
double _real;
double _image;
};
//默认构造函数
Complex::Complex()
{
this->_real = 0.0;
this->_image = 0.0;
}
//有参构造函数
Complex::Complex(double r, double i)
{
this->_real = r;
this->_image = i;
}
//返回复数的实部
double Complex::real()
{
return this->_real;
}
//返回复数的虚部
double Complex::image()
{
return this->_image;
}
//重载复数类的加号运算符
Complex Complex::operator+(const Complex& A)
{
Complex temp;
temp._real = this->_real + A._real;
temp._image = this->_image + A._image;
return temp;
}
//重载复数类的减号运算符
Complex Complex::operator-(const Complex& A)
{
Complex temp;
temp._real = this->_real - A._real;
temp._image = this->_image - A._image;
return temp;
}
//重载复数类的乘号运算符
Complex Complex::operator*(const Complex& A)
{
Complex temp;
temp._real = this->_real*A._real - this->_image*A._image;
temp._image = this->_real*A._image + this-