zoukankan      html  css  js  c++  java
  • 类(传入的形参为非指针形式)-复数的实现

     注意此处构造函数传入的参数为非指针形式,数据也是非指针形式。

    #ifndef __MYCOMPLEX__
    #define __MYCOMPLEX__
    
    //定义了类——复数,作为示例,介绍了类的基本定义方式
    
    //类以部分函数的声明
    class complex; 
    complex&
      __doapl (complex* ths, const complex& r);
    complex&
      __doami (complex* ths, const complex& r);
    complex&
      __doaml (complex* ths, const complex& r);
    
    //定义类complex:一般类会把数据作为private的,而将一些对外的接口函数作为public的
    class complex
    {
    public:
      //构造函数,这个地方r和i是传入的形参,后面赋值给私有成员变量re和im了
      complex (double r = 0, double i = 0): re (r), im (i) { }
      //操作符重载,扩展C++中的+=、-=、*=、/=运算符,使其可以应用在复数的运算中
      complex& operator += (const complex&);
      complex& operator -= (const complex&);
      complex& operator *= (const complex&);
      complex& operator /= (const complex&);
      //获得复数的实部和虚部
      double real () const { return re; }
      double imag () const { return im; }
    private:
      double re, im;
    
      //友元函数,在类外也可以直接访问private成员变量
      friend complex& __doapl (complex *, const complex&);
      friend complex& __doami (complex *, const complex&);
      friend complex& __doaml (complex *, const complex&);
    };
    
    //这个函数在类中声明为友元函数了
    inline complex&
    __doapl (complex* ths, const complex& r)
    {
      ths->re += r.re;
      ths->im += r.im;
      return *ths;
    }
     
    inline complex&
    complex::operator += (const complex& r)
    {
      //this 是这个类本身,在使用中+=左边的对象就是this
      return __doapl (this, r);
    }
    
    inline complex&
    __doami (complex* ths, const complex& r)
    {
      ths->re -= r.re;
      ths->im -= r.im;
      return *ths;
    }
     
    inline complex&
    complex::operator -= (const complex& r)
    {
      return __doami (this, r);
    }
     
    inline complex&
    __doaml (complex* ths, const complex& r)
    {
      double f = ths->re * r.re - ths->im * r.im;
      ths->im = ths->re * r.im + ths->im * r.re;
      ths->re = f;
      return *ths;
    }
    
    inline complex&
    complex::operator *= (const complex& r)
    {
      return __doaml (this, r);
    }
     
    //上面的函数返回的都是引用,相当于直接返回了变量地址
    //下面的函数返回的都不是引用,而是局部变量的拷贝
    inline double
    imag (const complex& x)
    {
      return x.imag ();
    }
    
    inline double
    real (const complex& x)
    {
      return x.real ();
    }
    
    inline complex
    operator + (const complex& x, const complex& y)
    {
      return complex (real (x) + real (y), imag (x) + imag (y));
    }
    
    inline complex
    operator + (const complex& x, double y)
    {
      return complex (real (x) + y, imag (x));
    }
    
    inline complex
    operator + (double x, const complex& y)
    {
      return complex (x + real (y), imag (y));
    }
    
    inline complex
    operator - (const complex& x, const complex& y)
    {
      return complex (real (x) - real (y), imag (x) - imag (y));
    }
    
    inline complex
    operator - (const complex& x, double y)
    {
      return complex (real (x) - y, imag (x));
    }
    
    inline complex
    operator - (double x, const complex& y)
    {
      return complex (x - real (y), - imag (y));
    }
    
    inline complex
    operator * (const complex& x, const complex& y)
    {
      return complex (real (x) * real (y) - imag (x) * imag (y),
                   real (x) * imag (y) + imag (x) * real (y));
    }
    
    inline complex
    operator * (const complex& x, double y)
    {
      return complex (real (x) * y, imag (x) * y);
    }
    
    inline complex
    operator * (double x, const complex& y)
    {
      return complex (x * real (y), x * imag (y));
    }
    
    complex
    operator / (const complex& x, double y)
    {
      return complex (real (x) / y, imag (x) / y);
    }
    
    inline complex
    operator + (const complex& x)
    {
      return x;
    }
    
    inline complex
    operator - (const complex& x)
    {
      return complex (-real (x), -imag (x));
    }
    
    inline bool
    operator == (const complex& x, const complex& y)
    {
      return real (x) == real (y) && imag (x) == imag (y);
    }
    
    inline bool
    operator == (const complex& x, double y)
    {
      return real (x) == y && imag (x) == 0;
    }
    
    inline bool
    operator == (double x, const complex& y)
    {
      return x == real (y) && imag (y) == 0;
    }
    
    inline bool
    operator != (const complex& x, const complex& y)
    {
      return real (x) != real (y) || imag (x) != imag (y);
    }
    
    inline bool
    operator != (const complex& x, double y)
    {
      return real (x) != y || imag (x) != 0;
    }
    
    inline bool
    operator != (double x, const complex& y)
    {
      return x != real (y) || imag (y) != 0;
    }
    
    #include <cmath>
    
    inline complex
    polar (double r, double t)
    {
      return complex (r * cos (t), r * sin (t));
    }
    
    inline complex
    conj (const complex& x) 
    {
      return complex (real (x), -imag (x));
    }
    
    inline double
    norm (const complex& x)
    {
      return real (x) * real (x) + imag (x) * imag (x);
    }
    
    #endif   //__MYCOMPLEX__
  • 相关阅读:
    MongoDB 生态 – 可视化管理工具
    SOLR对多个(关联)表创建索引
    sublime 插件zen coding
    12/12工作笔记
    阅读《深入理解JavaScript定时机制》
    继续谈论XSS
    支付宝快捷支付模型
    谈论XSS
    生产者消费者模型
    如何根据iframe内嵌页面调整iframe高宽续篇
  • 原文地址:https://www.cnblogs.com/yanxingang/p/14684006.html
Copyright © 2011-2022 走看看