个人学习笔记
我们知道在C++中重载运算符是很方便的,尤其是类对象之间的运算尤为方便。但是在重载的运算符中有一个比较特殊,就是++和--运算符。
我们拿++运算符(重载用于类对象之间的运算)来说,这个是存在前++和后++的,我们怎么在使用时辨识这两个++呢?在重载时又要注意什么问题呢?
当我们重载一个运算符时,尽量不要失去原有的神韵,也就是说不要失去了原来的本意最好。于是我们先看看重载前的++运算符怎么使用:
#include <iostream>
using namespace std;
int main()
{
int a = 2;
int b = a++;//此时b的值为2
int c = ++a;//此时c的值为4
cout<<b<<' '<<c<<endl;
//int d = a++++; //error
int e = ++++a;
cout<<e<<endl;
return 0;
}
我们通过上面这个小程序了解了一些信息:后++是不能连用的,但是前++可以的。
我们得想想这对我们重载我们自己的++有什么启示。也就是说当我们只是一次++时,是要返回一个值的,既然能够使用,所以这个值我们是可以拿过来修改的,同理,既然后++不能连用,这就意味着其返回值是不能修改的。分析完我们开始重载。
通过上面的例子我们想我们重载前++还是比较简单的,于是我们先来开始重载前++。
#include <iostream>
using namespace std;
class Complex
{
private:
float a;
float b;
public:
Complex(float _a=0,float _b=0)//赋初值为零
:a(_a),b(_b)
{}
void dis();
Complex& operator ++();
};
void Complex::dis()
{
cout<<"("<<a<<","<<b<<")"<<endl;
}
Complex& Complex::operator ++()//特别注意其返回值
{
this->a++;
this->b++;
return *this;
}
int main()
{
Complex c(1,2);
Complex c1;
c1 = ++++c;
c.dis();
c1.dis();
return 0;
}
上面已经重载完前++运算符了,就像刚刚我们强调的问题,我们的返回值必须要能修改,于是我们返回的是其引用(上面的注释部分)。
我们说这次重载我们没用考虑怎样避开两个++怎样区别的问题,现在我们要重载后++,我们要考虑怎么写了,反正不能和上面一样。
这里我们就用到一个叫做哑元的东西,哑元就是只有类型没有名称的参数,它用来区别不同的函数,比如这里的前++和后++。
现在我们可以用这个哑元来重载后++。
#include <iostream>
using namespace std;
class Complex
{
float a;
float b;
public:
Complex(float _a=0,float _b=0)
:a(_a),b(_b){}
void dis();
const Complex operator ++(int);
};
void Complex::dis()
{
cout<<"("<<a<<","<<b<<")"<<endl;
}
const Complex Complex::operator++(int)
{
this->a++;
this->b++;
return *this;
}
int main()
{
Complex c(1,2);
Complex c1;
c1 = c++++;
c.dis();
c1.dis();
return 0;
}
我们还是强调返回值的问题,我们这次将返回值设为const,也就是不能修改了。
这样我们重载就完成了。
注意:
①返回值在这里是重点,一个是要求返回的值能够修改,一个是不能修改。
②重载一个运算符要联系其本意,不要偏离。