一、复数类重载相关基础知识
详情见上一篇博客,奉上链接
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