奥古斯丁少爷 发表于 2016-4-6 21:56:45

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;

muyu0096 发表于 2016-4-7 15:33:14

因为++是一元运算符,而+是2元运算符,重载后依旧是这样,所以,对于加号你可以写成对象A+对象B,对于++,你只能写对象A++,而写成A++B就是2元运算符了。
实际上 Base operator++(int b=0);可以只写成 Base operator++(int);
A++是隐式调用A.operator();      
A.operator(),和A.operator(0)都是显示调用
页: [1]
查看完整版本: C++重载前缀式和后缀式自增的问题