• 关于运算符重载


    前言

    ……

    这篇博客可能会比较短,但是这应该是我研究最久的博客之一了。

    思考起因

    首先看到这道题,因为位数明显会很大,所以第一个要想到的就是这道题要用到高精。

    当然,用到高精度的题很多。

    而这道题还要用到快速幂。

    同时用到高精和快速幂的题目也很多。

    的确。

    众所周知,在快速幂运算中,要多次用到乘法。所以乘法的简洁性很重要,否则,程序写起来会很麻烦。而我们只想写这样的快速幂:

    int poww(int a, int b) 
    {
        int ans = 1, base = a;
        while (b != 0) 
       {
            if (b & 1 != 0)
                ans *= base;
                base *= base;
                b >>= 1;
        }
        return ans;
    }

    以后更难的题中,我们还要用到更多高精乘法。

    那怎么办呢?

    这就用到我们的运算符重载了。

    研究历程

    再讲讲我的研究历程吧。

    先是想到要用重载运算符,觉得应该和重载函数是一样的,就自己先写了这个:

    string operator*(string a,string b)
    {
        ……
    }

    发现不太行。

    于是从网上找资料:

    #include <iostream>
    using namespace std;
     
    class Box
    {
       public:
     
          double getVolume(void)
          {
             return length * breadth * height;
          }
          void setLength( double len )
          {
              length = len;
          }
     
          void setBreadth( double bre )
          {
              breadth = bre;
          }
     
          void setHeight( double hei )
          {
              height = hei;
          }
          // 重载 + 运算符,用于把两个 Box 对象相加
          Box operator+(const Box& b)
          {
             Box box;
             box.length = this->length + b.length;
             box.breadth = this->breadth + b.breadth;
             box.height = this->height + b.height;
             return box;
          }
       private:
          double length;      // 长度
          double breadth;     // 宽度
          double height;      // 高度
    };
    // 程序的主函数
    int main( )
    {
       Box Box1;                // 声明 Box1,类型为 Box
       Box Box2;                // 声明 Box2,类型为 Box
       Box Box3;                // 声明 Box3,类型为 Box
       double volume = 0.0;     // 把体积存储在该变量中
     
       // Box1 详述
       Box1.setLength(6.0); 
       Box1.setBreadth(7.0); 
       Box1.setHeight(5.0);
     
       // Box2 详述
       Box2.setLength(12.0); 
       Box2.setBreadth(13.0); 
       Box2.setHeight(10.0);
     
       // Box1 的体积
       volume = Box1.getVolume();
       cout << "Volume of Box1 : " << volume <<endl;
     
       // Box2 的体积
       volume = Box2.getVolume();
       cout << "Volume of Box2 : " << volume <<endl;
     
       // 把两个对象相加,得到 Box3
       Box3 = Box1 + Box2;
     
       // Box3 的体积
       volume = Box3.getVolume();
       cout << "Volume of Box3 : " << volume <<endl;
     
       return 0;
    }
    #include<iostream>
    using namespace std;
    class complex { //复数类
    public: //外部接口
     complex(double r = 0.0, double i = 0.0) { real = r; imag = i; } //构造函数_ 
     const complex operator+(const complex &c) const ;
     
     const complex operator - (const complex &c) const;
     void display(); //输出复数
    private: //私有数据成员
     double real;  //复数实部
     double imag;  //复数虚部
    };
     
    const complex complex:: operator+(const complex &c) const {
     return complex(real + c.real, imag + c.imag);
    }
     
    const complex complex:: operator-(const complex &c) const {
     return complex(real - c.real, imag - c.imag);
    }
    void complex::display() {
     cout << "(" << real << "," << imag << " i)" << endl;
    }
    void main() {
     complex c1(5, 4), c2(2,
    10), c3; //三个复数类的对象
     cout << "c1="; c1.display();
     cout << "c2="; c2.display();
     c3 = c1 + c2; //使用重载运算符完成复数减法
     cout << "c3=c1+c2=";
     c3.display();
     c3 = c1 - c2; //使用重载运算符完成复数加法
     cout << "c3=c1-c2=";
     c3.display();
    }

    全都是这种。

    这些东西,让我这个连类都不知道是什么的蒟蒻怎么看得懂?!

    继续不停的翻找,还都是这些。

    突然,灵光一现——

    以前我在上清北学堂的时候,老师讲过大于、小于号的重载!

    于是又返回去看:

    终于找到了!就是这个!

    正文

    这只是一个记录学习历程的博客,所以正文很短。

    所以我们要写的重载高精度乘法就是这样:

    string operator*(const string &a,const string &b)
    {
        ……
        return ……;
    }

    还有这个:

    ……恩,就这些……

  • 相关阅读:
    深入浅出TCP之listen
    indexing and hashing
    c++四种强制类型转化
    c++实现web服务框架
    MVC、MVP、MVVM概念解析
    常用设计模式
    [React]虚拟DOM
    防抖和节流
    函数柯里化
    apply, bind, call方法剖析
  • 原文地址:https://www.cnblogs.com/arknight/p/12775590.html
Copyright © 2020-2023  润新知