• 第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++规定赋值操作符(=)只能重载为成员函数
    操作符重载不能改变原操作符的优先级
    操作符重载不能改变操作数的个数
    操作符重载不应改变操作符原有语义

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

  • 相关阅读:
    Binary Tree Maximum Path Sum
    ZigZag Conversion
    Longest Common Prefix
    Reverse Linked List II
    Populating Next Right Pointers in Each Node
    Populating Next Right Pointers in Each Node II
    Rotate List
    Path Sum II
    [Leetcode]-- Gray Code
    Subsets II
  • 原文地址:https://www.cnblogs.com/-glb/p/11901951.html
Copyright © 2020-2023  润新知