C++重载前缀式和后缀式自增的问题
#include<iostream>class Base
{
public:
Base(int *p,int *q):begin(p),end(q),num(p){} //分别传入数组的头尾的地址
int *begin; //指向数组头
int *end; //指向数组尾
int *num ;//指向当前的数组元素,初始化为begin
Base& operator++(); //前缀式自增
Base operator++(int b=0); //后缀式自增,为了区别前缀式自增,增加了一个无用的形参,同时不再返回引用,因为后缀式自增返回的是原本的
//状态。而原本的状态是用一个临时对象保存的,返回一个临时对象的引用无意义
};
Base& Base::operator++()
{
if(num==end)
{
std::cout<<"已到最后一个位置";
}
else{num++;}
}
Base Base::operator++(int b=0)
{
Base fb(*this); //创建一个副本保留保留的状态,后缀式自增的特点所决定
++*this; //这里用了我们在之前定义的前缀式自增
return fb; //返回原本的状态
}
int main(void)
{
int a={0,1,2};
Base base(&a,&a);
base++; //这样是可以正确调用后缀式自增的
//base++0; (这样是错误的,但是为什么是错误的呢,++还有一个形参是int型啊,我给一个0. 同时在重载+号时,对象A+对象B,+号能把对象当 做是形参,那么++也能把0当作形参才对呀,为什么是错的呢)
base.operator++(12); //这样显示调用是可以的
std::cout<<*(base.num);
return 0;
因为++是一元运算符,而+是2元运算符,重载后依旧是这样,所以,对于加号你可以写成对象A+对象B,对于++,你只能写对象A++,而写成A++B就是2元运算符了。
实际上 Base operator++(int b=0);可以只写成 Base operator++(int);
A++是隐式调用A.operator();
A.operator(),和A.operator(0)都是显示调用
页:
[1]