zoukankan      html  css  js  c++  java
  • 侯捷《C++面向对象开发》--复数类的实现

    
    

    #ifndef __COMPLEX__
    #define __COMPLEX__
    #include<ostream>

    
    

    class complex
    {
    public:
    complex(const double r = 0, const double i = 0) //构造函数,r和i的默认参数为0
    :re(r), im(i) //初始化:将re初始化为r,im初始化为i
    {}

    
    

    //操作符重载,参数中实际上还包含一个隐藏参数this,返回的是一个complex的引用
    complex& operator += (const complex&);
    complex& operator -= (const complex&);
    complex& operator *= (const complex&);
    complex& operator /= (const complex&);
    complex& operator = (const complex&);

    
    

    // 成员函数,用于查看一个complex对象的实数部分和虚数部分,我们不希望这部分被更改,所以添加const
    double real() const { return re; }
    double imag() const { return im; }

    
    

    //成员函数,用于计算共轭复数
    complex conjugate() const
    {
    return complex(this->real(), -1 * this->imag());
    }
    private:
    double re, im;

    
    

    // 友元函数,友元函数不是类的成员函数,但友元函数可以通过.操作获取类的private变量。友元函数打破了类的封装
    friend complex& __doapl(complex*, const complex&);
    friend complex& __doami(complex*, const complex&);
    friend complex& __doamu(complex*, const complex&);
    };

    
    

    //重载+=
    complex& __doapl(complex* ths, const complex& x)
    {
    ths->re += x.re;
    ths->im += x.im;
    return *ths;
    }

    
    

    complex& complex::operator += (const complex& x)
    {
    return __doapl(this, x);
    }

    
    

    //重载-=
    complex& __doami(complex* ths, const complex& x)
    {
    ths->re -= x.re;
    ths->im -= x.im;
    return *ths;
    }

    
    

    complex& complex::operator-= (const complex& x)
    {
    return __doami(this, x);
    }

    
    

    //重载*=
    complex& __doamu(complex* ths, const complex& x)
    {
    double temp = ths->re * x.re - ths->im * x.im;
    ths->im = (ths->re * x.im + ths->im * x.re);
    ths->re = temp;
    return *ths;
    }

    
    

    complex& complex::operator*= (const complex& x)
    {
    return __doamu(this, x);
    }

    
    


    //重载/=
    complex& __doadiv(complex* ths, const complex& x)
    {
    double r = (ths->real() * x.real() + ths->imag() * x.imag()) / (x.real() * x.real() + x.imag() * x.imag());
    double i = (ths->imag() * x.real() - ths->real() * x.imag()) / (x.real() * x.real() + x.imag() * x.imag());
    *ths = complex(r, i);
    return *ths;
    }

    
    

    complex& complex::operator/= (const complex& x)
    {
    return __doadiv(this, x);
    }

    
    

    complex& complex:: operator=(const complex& x)
    {
    this->re = x.real();
    this->im = x.imag();
    return *this;
    }

    
    

    //重载+操作,具体分为三种情况:复数+复数、复数+实数、复数+实数。其它重载操作类似
    // 这里返回的不是reference,而是一个value。
    //不能返回reference的原因是:进行‘+’操作后得到的对象,存放在一个临时的complex中。
    //这个临时对象的生命周期在函数结束时结束。
    complex operator + (const complex& c1, const complex& c2)
    {
    return complex(c1.real() + c2.real(), c1.imag() + c2.imag());
    }

    
    

    complex operator + (const complex& c1, const double& c2)
    {
    return complex(c1.real() + c2, c1.imag());
    }

    
    

    complex operator + (const double& c1, const complex& c2)
    {
    return complex(c1 + c2.real(), c2.imag());
    }

    
    

    complex operator - (const complex& c1, const complex& c2)
    {
    return complex(c1.real() - c2.real(), c1.imag() - c2.imag());
    }

    
    

    complex operator - (const complex& c1, const double& c2)
    {
    return complex(c1.real() - c2, c1.imag());
    }

    
    

    complex operator - (const double& c1, const complex& c2)
    {
    return complex(c1 - c2.real(), c2.imag());
    }

    
    

    complex operator * (const complex& c1, const complex& c2)
    {
    double r = c1.real() * c2.real() - c1.imag() * c2.imag();
    double i = c1.real() * c2.imag() + c1.imag() * c2.real();
    return complex(r, i);
    }

    
    

    complex operator / (const complex& c1, const complex& c2)
    {
    double r = (c1.real() * c2.real() + c1.imag() * c2.imag()) / (c2.real() * c2.real() + c2.imag() * c2.imag());
    double i = (c1.imag() * c2.real() - c1.real() * c2.imag()) / (c2.real() * c2.real() + c2.imag() * c2.imag());
    return complex(r, i);
    }

    
    

    bool operator == (const complex& c1, const complex& c2)
    {
    if (c1.real() != c2.real() || c1.imag() != c2.imag())
    return false;
    return true;
    }

    
    

    inline double real(const complex& x)
    {
    return x.real();
    }

    
    

    inline double imag(const complex& x)
    {
    return x.imag();
    }

    
    

    // 重载输出操作
    std::ostream& operator << (std::ostream& os, const complex& x)
    {
    return os << "(" << real(x) << "," << imag(x) << ")";
    }
    #endif // !__COMPLEX__

    
    
    
    #include"complex.h"
    #include<ostream>
    #include<iostream>
    using namespace std;
    
    int main()
    {
        complex c1(double(1), double(2));
        while (1)
        {
            double a, b,c,d;
            cin >> a >> b >> c >> d;
            complex c1(a, b);
            complex c2(c, d);
            cout << "c1" << c1 << endl;
            cout << "c2" <<c2 << endl;
            cout << "conjugate" << c1.conjugate() << endl;
            cout << "c1/c2=" << (c1 / c2) << endl;
            cout << "c1*c2=" << (c1 * c2) << endl;
            cout << "c1-c2=" << (c1 - c2) << endl;
            cout << "c1+c2=" << (c1 + c2) << endl;
            cout << "c1*=c2=" << (c1 *= c2) << endl;
            cout << real(c1) << " " <<imag(c1) << endl;
        }
        return 0;
    }
  • 相关阅读:
    1491: [NOI2007]社交网络
    Ombrophobic Bovines
    1566: [NOI2009]管道取珠
    1564: [NOI2009]二叉查找树
    1497: [NOI2006]最大获利
    mysql数据库修改字段及新增字段脚本
    NIO
    Lombok用法及标签释义
    idea2017.2延长使用时间
    IDEA 注册码
  • 原文地址:https://www.cnblogs.com/alan-W/p/14171077.html
Copyright © 2011-2022 走看看