鱼C论坛

 找回密码
 立即注册
查看: 793|回复: 1

C++重载前缀式和后缀式自增的问题

[复制链接]
发表于 2016-4-6 21:56:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[3]={0,1,2};
    Base base(&a[0],&a[2]);
    base++;    //这样是可以正确调用后缀式自增的
   //base++0;    (这样是错误的,但是为什么是错误的呢,++还有一个形参是int型啊,我给一个0. 同时在重载+号时,对象A+对象B,+号能把对象当                做是形参,那么++也能把0当作形参才对呀,为什么是错的呢)
    base.operator++(12);      //这样显示调用是可以的
    std::cout<<*(base.num);
    return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)都是显示调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表