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

猜你喜欢

转载自blog.csdn.net/dai_wen/article/details/80248166