【C++】Complex复数类运算符重载(全局函数实现)

一、复数类重载相关基础知识

详情见上一篇博客,奉上链接
https://blog.csdn.net/dai_wen/article/details/80245987

这里展示Complex复数类运算符重载的另一种方式:利用全局函数实现
我们知道,在c++中,类的成员函数与全局函数可以互相转换,全局函数转为类的成员函数时,会将参数列表中的第一个参数隐藏起来,用一个隐式的this指针来代替,类的成员函数转全局函数时,过程相反,为了保证类的私有成员变量可以被该全局函数正常访问,需要在该类中声明该全局函数为其友元函数,本文着重谈全局函数来实现运算符的重载。

《1》程序实现如下

#include<iostream>
using namespace std;
class Complex
{
public:
	friend Complex operator+(Complex &c1,Complex &c2);//重载+全局函数对应的类的友元函数
	friend Complex operator-(Complex &c1,Complex &c2);//重载-全局函数对应的类的友元函数
	friend Complex operator*(Complex &c1,Complex &c2);//重载*全局函数对应的类的友元函数
	friend Complex operator/(Complex &c1,Complex &c2);//重载/全局函数对应的类的友元函数
	friend Complex& operator++(Complex &c1);//重载前置++全局函数对应的类的友元函数
	friend Complex& operator--(Complex &c1);//重载前置--全局函数对应的类的友元函数
	friend Complex operator++(Complex &c1,int);//重载后置++全局函数对应的类的友元函数
	friend Complex operator--(Complex &c1,int);//重载后置--全局函数对应的类的友元函数
public:
	Complex(int a = 0, int b = 0)
	{
		this->m_a = a;
		this->m_b = b;	
	}

	void PrintCom()
	{
		cout<<m_a<<"+"<<m_b<<"i"<<endl;
	}

private:
	int m_a;
	int m_b;

};

Complex operator+(Complex &c1,Complex &c2)
{
	Complex tmp;
	tmp.m_a = c1.m_a +c2.m_a ;
	tmp.m_b = c1.m_b +c2.m_b ;
	return tmp;
}

Complex operator-(Complex &c1,Complex &c2)
{
	Complex tmp;
	tmp.m_a = c1.m_a - c2.m_a;
	tmp.m_b = c1.m_b - c2.m_b ;
	return tmp;
}

Complex operator*(Complex &c1,Complex &c2)
{
	Complex tmp;
	tmp.m_a = c1.m_a * c2.m_a ;
	tmp.m_b = c1.m_b * c2.m_b ;
	return tmp;
}
Complex operator/(Complex &c1,Complex &c2)
{
	Complex tmp;
	tmp.m_a = c1.m_a / c2.m_a ;
	tmp.m_b = c1.m_b / c2.m_b ;
	return tmp;
}


Complex& operator++(Complex &c1)
{
	c1.m_a ++;
	c1.m_b ++;
	return c1;
}


Complex& operator--(Complex &c1)
{
	c1.m_a --;
	c1.m_b --;
	return c1;
}

Complex operator++(Complex &c1,int)
{
	Complex tmp;
	tmp.m_a = c1.m_a ++;
	tmp.m_b = c1.m_b ++;
	return tmp;
}

Complex operator--(Complex &c1,int)
{
	Complex tmp;
	tmp.m_a = c1.m_a -- ;
	tmp.m_b = c1.m_b-- ;
	return tmp;
}

void test()
{
	Complex c1( 1, 2 ), c2( 3, 4 );
	c1.PrintCom();     //1+2i
	c2.PrintCom();     //3+4i
	cout<<'\n';

	Complex c3 = c1 + c2;
	c3.PrintCom();     //4+6i
	cout<<'\n';

	Complex c4  = c1 - c2;
	c4.PrintCom();     //-2-2i
	cout<<'\n';

	Complex c5 = c1 * c2;
	c5.PrintCom();     //3+8i
	cout<<'\n';

	Complex c6 = c1 / c2;
	c6.PrintCom();     //0+0i
	cout<<'\n';

	++c1;
	c1.PrintCom();     //2+3i
	cout<<'\n';

	--c1;
	c1.PrintCom();     //1+2i
	cout<<'\n';

	c1++;
	c1.PrintCom();     //2+3i
	cout<<'\n';

	c1--;
	c1.PrintCom();     //1+2i
}
int main()
{
	test();
	return 0;
}

《2》结果展示

这里写图片描述

《3》特别注意
**1、不可以使用全局函数以及其对应的友元函数来重载的操作符有 =、 ()、 [ ]、 ->、 **
这里写图片描述
2、必须使用全局函数以及其对应的友元函数来重载的操作符为 <<
这里写图片描述

《4》使用类的成员函数重载 =、()、[ ]、 ->,使用全局函数重载<<
详情见:
https://blog.csdn.net/dai_wen/article/details/80245987


版权声明:本文为dai_wen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。