【类之旅3】让你的高精度类和整形一样方便地使用——运算符重载和使用小技巧

【类之旅3】让你的高精度类和整形一样方便地使用——运算符重载

1.正文

1.1.运算符重载基础语法

    还记得我们之前分装的一个高精度结构体吗?

class bigint {
   // ...
}
int plus(bigint a, bigint b) {
    // do something...
}
int main() {
    bigint a, b, c;
    in_data(a); in_data(b);
    c = plus(a, b);
    out_put(c);
    return 0;
}

    如果使用一个函数模拟高精度加法的话,不是那么的直观。有没有办法让我们像使用整形一样使用高精度加法呢?当然有。那就是运算符重载。基本格式如下:

class   类名  {
public: // 想要在类外使用重载的运算符,就必须定义成public
        返回值类型  operator  运算符(参数) {  //  最多只能有一个参数
                函数体
        }
};

    这样,我们就可以让我们的高精度像整形一样使用了。示例如下:

#define MAXN 250
class bigint {
    int a[MAXN], len;
public:
	bigint(int x = 0); // ...
	int& operator [] (const int& i);
	bigint operator + (bigint rhs)const;
};

int& bigint::operator [] (const int& i) {
	return a[i];
}

bigint bigint::operator + (bigint rhs) const{
    bigint ans;
    ans.len = max(len, rhs.len);
    for(int i = 1; i <= max(len, rhs.len); i++)
    	ans[i] += a[i] + rhs[i];
    for(int i = 1; i <= max(len, rhs.len); i++)
    	ans[i+1] += ans[i] / 10, ans[i] %= 10;
    if(ans[ans.len + 1])ans.len++;
	return ans;
}

    常见的能够重载的运算符有以下几个:

类型运算符
赋值运算=
数学运算++=--=**=//=++--%
逻辑比较<><=>===!=
逻辑运算&&||!
位运算&&=||=~^^=<<<<=>>>>=
特殊符号[]()->->*,newdeletenew[]delete[]

1.2.为什么要有运算符重载

    看到我们上面分装的高精度整数类,经过重载后就可以像整形int一样简单直观的使用了。是程序更加的简单、清晰、明了。其实,类似于vectorstring这样 S T L STL STL中分装的容器,也大量的使用了运算符重载的语法。

    举个例子,在普通的整型变量ab中,a+b代表将变量ab中的数值相加得到的结果。但是如果他们是两个string类型的变量,+运算符就相当于将它们两个中存储的字符串拼接起来得到的新的字符串,如下:

string a = "I want AK ", b = "NOI and NOIP";
string c = a + b;
cout << c << endl; // 输出:I want AK NOI and NOIP

    如果想将这个功能分装成一个函数,就会变成类似AddString(a,b)这样的形式。十分不直观。可见,运算符重载在 C + + C++ C++甚至是在所有面向对象语言中有多么重要。请大家学会之后灵活的运用到自己的程序之中。

2.附录

    附:如何重载前置一元运算符++--

class bigint {
    // ...
public:
    bigint operator++(int) { // 使用哑元参数,可以达到重载前置运算符的效果
        // ...
    }
}

    如何输入你的高精度类:

class bigint {
    // ...
public:
    friend istream& operator>>(istream& cin, bigint& num) {
        // ...
        return cin; // 链式编程
    }

    friend ostream& operator<<(ostream& cout, bigint& num) {
        // ...
        return cout; // 链式编程
    }
}

    如何在类(或结构体)内重载<并使用sort

class bigint {
    // ...
public:
    bool operator<(const bigint& rhs) const{
        // ...
    }
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值