【类之旅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;
}
常见的能够重载的运算符有以下几个:
类型 | 运算符 |
---|---|
赋值运算 | = |
数学运算 | + 、+= 、- 、-= 、* 、*= 、/ 、/= 、++ 、-- 、% |
逻辑比较 | < 、> 、<= 、>= 、== 、!= |
逻辑运算 | && 、|| 、! |
位运算 | & 、&= 、| 、|= 、~ 、^ 、^= 、<< 、<<= 、>> 、>>= |
特殊符号 | [] 、() 、-> 、->* 、, 、new 、delete 、new[] 、delete[] |
1.2.为什么要有运算符重载
看到我们上面分装的高精度整数类
,经过重载后就可以像整形int
一样简单直观的使用了。是程序更加的简单、清晰、明了。其实,类似于vector
、string
这样
S
T
L
STL
STL中分装的容器,也大量的使用了运算符重载的语法。
举个例子,在普通的整型变量a
、b
中,a+b
代表将变量a
和b
中的数值相加得到的结果。但是如果他们是两个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{
// ...
}
}
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育