过年玩了好久,该回来继续学习了。记录一下运算符重载的练习。
一、关于运算符重载
基于我的理解:运算符重载主要是对于常见的已有的运算符,根据他们在已经定义好的功能进行重新定义,让其能够在我们自己定义的数据类型上使用。比如目前练习的这个递减运算符(--),让其不仅保留原有的功能,还适应了我们自己定义的类创建出的对象的--操作。
二、递减运算符重载
递减运算符又分为前置递减运算(先减后用)和后置递减运算(先用后减)。这两种情况重载要分别定义,其中,后置递减运算符重载定义中在参数列表里使用占位参数int占位:MyInteger operator++(int){}以和前置运算符重载的定义做区分。具体实现在代码中使用注释标注。
三、代码实现
/*
Author: Euan Cai
Creation time: 2024-02-19
*/
//运算符重载:递减运算符练习
#include <iostream>
using namespace std;
class MyInteger {
friend ostream& operator<< (ostream& cout, MyInteger integer);
public:
//构造函数,随便给m_Int赋一个合理的初值,这里使用2;
MyInteger() {
m_Int = 2;
}
//前置递减重载
//前置递减为先递减再使用(输出)
MyInteger& operator--() {
m_Int--; //先递减
return *this; //再返回(使用),返回自身
}
//后置递减重载
//后置递减为先使用(输出)再递减
MyInteger operator--(int) {
//后置递减重载分成三步实现: (后置递增类似)
//1、首先记录当前的数据:
MyInteger temp = *this;
//2、将当前值递减
m_Int--;
//3、返回递减前的值
return temp;
}
private:
int m_Int;
};
//左移运算符重载,用于cout直接输出刚刚定义的MyInteger类
ostream& operator<< (ostream & cout, MyInteger integer) {
cout << integer.m_Int;
return cout;
}
//测试前置递减重载
void test01() {
MyInteger integer; //创建一个MyInteger类的对象,通过构造函数赋初值后该对象里的m_Int值为2;
cout << --(--integer) << endl; //前置递减输出,连续递减两次,先递减后输出,这里输出为0;
cout << integer << endl; //经过上一行的两次递减,integer对象内的值减为0,输出0;
}
//测试后置递减重载
void test02() {
MyInteger integer01;//创建一个MyInteger类的对象,通过构造函数赋初值后该对象里的m_Int值为2;
cout << integer01-- << endl;//后置递减输出,先输出后递减,这里先输出2;
cout << integer01 << endl; //通过上一行的递减操作,integer01对象内的值减为1,这里输出1;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
四、注意
前置递减返回引用:因为要使其一直对同一个数据进行递减操作,如果返回的是值,则每次返回都调用了拷贝构造函数,对新的数据进行操作,原来的数据本身并没有改变,从而不能实现链式。
后置递减返回值:因为要实现先使用后递减,则必须返回一个递减前的数据拿来使用,参考代码里相应的部分,如果返回temp的引用,而temp是一个局部对象,局部对象在当前函数执行完后立即释放,返回的temp引用也会随之错误,所以只能返回值。
(递增同理)