从C++运算符重载到类模板(以复数类为例)

这几天在用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-
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值