zoukankan      html  css  js  c++  java
  • 第31课 完善的复数类

    完善的复数类
    复数类应该具有的操作
    运算:+,-,*,/
    比较:==,!=
    赋值:=
    求模:modulus

    利用操作符重载
    -统一复数与实数的运算方式
    -统一复数与实数的比较方式

    Complex operator + (const Complex& c);
    Complex operator - (const Complex& c);
    Complex operator * (const Complex& c);
    Complex operator / (const Complex& c);

    bool operator == (const Complex& c);
    bool operator != (const Complex& c);

    Complex& operator = (const Complex& c);

    complex.h

    #ifndef COMPLEX_H
    #define COMPLEX_H
    
    class Complex
    {
     private:
        int a;
        int b;
    
     public:
        Complex(double a=0, double b=0);
        double GetA();
        double GetB();
        double GetModulus();
    
        Complex operator + (const Complex& p);
        Complex operator - (const Complex& p);
        Complex operator * (const Complex& p);
        Complex operator / (const Complex& p);
    
        bool operator == (const Complex& p);
        bool operator != (const Complex& p);
    
        Complex& operator = (const Complex& p);
    
    
    };
    #endif // COMPLEX_H

    complex.cpp

    #include "complex.h"
    #include "math.h"
    
    Complex::Complex(double a, double b)
    {
        this->a = a;
        this->b = b;
    }
    
    double Complex::GetA()
    {
        return a;
    }
    
    double Complex::GetB()
    {
        return b;
    }
    
    double Complex::GetModulus()
    {
        return sqrt(a * a + b * b);
    }
    
    
    Complex Complex::operator +(const Complex& p)
    {
       double na = a + p.a;
       double nb = b + p.b;
       Complex ret(na,nb);
    
       return ret;
    
    }
    
    Complex Complex::operator -(const Complex& p)
    {
        double na = a - p.a;
        double nb = b - p.b;
        Complex ret(na,nb);
    
        return ret;
    
    }
    
    Complex Complex::operator *(const Complex& p)
    {
       // c1 = a + bi
       // c2 = c + di
       // c1 * c2 = (a*c -b*d) +(b*c+ a*d)
    
        double na = (a * p.a) - (b * p.b);
        double nb = (b * p.a) + (a * p.b);
        Complex ret(na,nb);
    
        return ret;
    }
    
    Complex Complex::operator /(const Complex& p)
    {
    
        double cm = p.a * p.a + p.b * p.b;
        double na = (a * p.a + b * p.b) / cm;
        double nb = (b * p.a - a * p.b) / cm;
        Complex ret(na,nb);
    
        return ret;
    }
    
    bool Complex::operator ==(const Complex& p)
    {
        return (a == p.a) && (b == p.b);
    }
    
    bool Complex::operator !=(const Complex& p)
    {
        return !(*this == p);
    }
    
    Complex& Complex::operator =(const Complex& p)
    {
        if(this != &p)
        {
            a = p.a;
            b = p.b;
        }
    
        return *this;
    }

    main.cpp

    #include <stdio.h>
    #include "complex.h"
    
    int main()
    {
        Complex c1(1,2);
        Complex c2(3,6);
    
        Complex c3 = c2 - c1;
        Complex c4 = c1 * c3;
        Complex c5 = c2 / c1;
    
        printf("c3.a = %f,c3.b = %f
    ",c3.GetA(),c3.GetB());
        printf("c4.a = %f,c4.b = %f
    ",c4.GetA(),c4.GetB());
        printf("c5.a = %f,c5.b = %f
    ",c5.GetA(),c5.GetB());
    
        Complex c6(2,4);
        printf("c3 == c6: %d
    ",c3 == c6);
        printf("c3 != c4: %d
    ",c3 != c4);
    
        (c3 = c2) = c1;
        printf("c3.a = %f,c3.b = %f
    ",c3.GetA(),c3.GetB());
        printf("c2.a = %f,c2.b = %f
    ",c2.GetA(),c2.GetB());
        printf("c1.a = %f,c1.b = %f
    ",c1.GetA(),c1.GetB());
    
    
        return 0;
    }

    注意事项:
    C++规定赋值操作符(=)只能重载为成员函数
    操作符重载不能改变原操作符的优先级
    操作符重载不能改变操作数的个数
    操作符重载不应改变操作符原有语义

    小结:
    复数的概念可以通过自定义类实现
    复数中的运算操作可以通过操作符重载实现
    赋值操作符只能通过成员函数实现
    操作符重载的本质为函数定义

  • 相关阅读:
    lpc2103 rtc寄存器说明
    LPC21O3第一课:第一个实验,LED灯闪烁及ADS1.2的初步使用
    把FlvJoiner更新了一下
    Boost智能指针——weak_ptr
    买了一个USB无线网卡
    Boost的转换函数(二)
    把FlvDownloader更新了一下
    在C#中快速实现拖放操作
    Flv视频分割软件FlvSplitter发布
    用Apatch给Messenger去广告
  • 原文地址:https://www.cnblogs.com/-glb/p/11901951.html
Copyright © 2011-2022 走看看