/*
目录:
   一 CComplex 类内
   二 CComplex 类外
   三 仿写std::cin和std::cout
*/
结构体对各种符号操作的重写设计,目的是扩展结构体/类的操作

一 CComplex 类内

#include "stdafx.h"
#include <iostream>

using namespace std;

class CComplex
{
public:
    CComplex()
    {
        m_fImag = m_fReal = 1;
    }
    CComplex(double r, double i):m_fReal(r), m_fImag(i)
    {
    }

    void Print()
    {
        cout << m_fReal << "," << m_fImag << endl;
    }
    operator double()
    {
        return m_fReal;
    }

    CComplex& operator!();
    CComplex& operator--();        // --i
    CComplex operator--(int);    // i--
    CComplex& operator++();        // ++i
    CComplex operator++(int);    // i++

    CComplex operator+(const CComplex &c2);
    CComplex operator-(const CComplex &c2);
    CComplex operator*(const CComplex &c2);
    CComplex operator/(const CComplex &c2);

private:
    double m_fReal;
    double m_fImag;
};

CComplex& CComplex::operator!()
{
    m_fReal = !m_fReal;
    m_fImag = !m_fImag;
    return *this;
}

CComplex& CComplex::operator--()
{
    --m_fReal;
    --m_fImag;
    return *this;
}

CComplex CComplex::operator--(int)
{
    CComplex temp = *this;
    --m_fReal;
    --m_fImag;
    return temp;
}

CComplex& CComplex::operator++()
{
    ++m_fReal;
    ++m_fImag;
    return *this;
}

CComplex CComplex::operator++(int)
{
    CComplex temp = *this;
    ++m_fReal;
    ++m_fImag;
    return temp;
}


CComplex CComplex::operator+(const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = this->m_fReal + c2.m_fReal;
    temp.m_fImag = this->m_fImag + c2.m_fImag;
    return temp;
}

CComplex CComplex::operator-(const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = this->m_fReal - c2.m_fReal;
    temp.m_fReal = this->m_fReal - c2.m_fReal;
    return temp;
}

CComplex CComplex::operator*(const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = this->m_fReal * c2.m_fReal;
    temp.m_fReal = this->m_fReal * c2.m_fReal;
    return temp;
}

CComplex CComplex::operator/(const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = this->m_fReal / c2.m_fReal;
    temp.m_fReal = this->m_fReal / c2.m_fReal;
    return temp;
}

int main(int argc, char *argv[], char **envp)
{
    CComplex c1(2, 3), c2(4, 5);
    CComplex c3 = c1 + (++c2);

    double d = c3;    // 类型重载
    c3.Print();

    CComplex c4;
    c4 = !c3;
    c4.Print();

    return 0;
}

二 CComplex 类外

#include "stdafx.h"
#include <iostream>

using namespace std;

class CComplex
{
public:
    CComplex()
    {
        m_fImag = m_fReal = 1;
    }
    CComplex(double r, double i):m_fReal(r), m_fImag(i)
    {
    }

    void Print()
    {
        cout << m_fReal << "," << m_fImag << endl;
    }
    operator double()
    {
        return m_fReal;
    }

    friend CComplex& operator!(CComplex &c1);
    friend CComplex& operator--(CComplex &c1);        // --i
    friend CComplex operator--(CComplex &c1, int);    // i--
    friend CComplex& operator++(CComplex &c1);        // ++i
    friend CComplex operator++(CComplex &c1, int);    // i++

    friend CComplex operator+(const CComplex &c1, const CComplex &c2);
    friend CComplex operator-(const CComplex &c1, const CComplex &c2);
    friend CComplex operator*(const CComplex &c1, const CComplex &c2);
    friend CComplex operator/(const CComplex &c1, const CComplex &c2);

private:
    double m_fReal;
    double m_fImag;
};

CComplex& operator!(CComplex &c1)
{
    c1.m_fReal = !c1.m_fReal;
    c1.m_fImag = !c1.m_fImag;
    return c1;
}

CComplex& operator--(CComplex &c1)
{
    --c1.m_fReal;
    --c1.m_fImag;
    return c1;
}

CComplex operator--(CComplex &c1, int)
{
    CComplex temp = c1;
    --c1.m_fReal;
    --c1.m_fImag;
    return temp;
}

CComplex& operator++(CComplex &c1)
{
    ++c1.m_fReal;
    ++c1.m_fImag;
    return c1;
}

CComplex operator++(CComplex &c1, int)
{
    CComplex temp = c1;
    ++c1.m_fReal;
    ++c1.m_fImag;
    return temp;
}


CComplex operator+(const CComplex &c1, const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = c1.m_fReal + c2.m_fReal;
    temp.m_fImag = c1.m_fImag + c2.m_fImag;
    return temp;
}

CComplex operator-(const CComplex &c1, const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = c1.m_fReal - c2.m_fReal;
    temp.m_fReal = c1.m_fReal - c2.m_fReal;
    return temp;
}

CComplex operator*(const CComplex &c1, const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = c1.m_fReal * c2.m_fReal;
    temp.m_fReal = c1.m_fReal * c2.m_fReal;
    return temp;
}

CComplex operator/(const CComplex &c1, const CComplex &c2)
{
    CComplex temp;
    temp.m_fReal = c1.m_fReal / c2.m_fReal;
    temp.m_fReal = c1.m_fReal / c2.m_fReal;
    return temp;
}


int main(int argc, char *argv[], char **envp)
{
    CComplex c1(2, 3), c2(4, 5);
    CComplex c3 = c1 + (++c2);

    double d = c3;    // 类型重载
    c3.Print();

    CComplex c4;
    c4 = !c3;
    c4.Print();

    return 0;
}


三 仿写std::cin和std::cout

  压缩包: 链接

没系统 std::cin 和std::cout好用
        1 兼容性
        2 支持少(endl)
01-15 01:56