注册 登录
编程论坛 C++教室

如何重载后置++啊:

sock258 发布于 2010-10-15 21:56, 2620 次点击


#include<iostream>
using namespace std;


class Increase
{
public:
    Increase(int x):value(x){}
    Increase& operator++(int);
    void display()
    {
        cout<<"the value is"<<value<<endl;
    }
private:
    int value;
};


Increase& Increase::operator++(int)
{
    value++;
    return *this;
}

void main()
{
    Increase n(20);
    n.display();//输出20
    (n++).display();//输出21
    n.display();//输出21


    system("pause");
}

这重载的后置++我觉的不是完美的  应为这样的重载我个人觉的和前置重载++一样的 就是在原数据上+1;

我的问题是如何才能使 重载后置++跟平时的++一样向这样输出:
 n.display();//输出20
 (n++).display();//输出20
  n.display();//输出21


10 回复
#2
pangding2010-10-15 22:17
一般的写法是:
Increase Increase::operator++(int)
{
    Increase tmp(*this);
    ++*this;
    return tmp;
}
你自己注意一下区别,好几点还是挺值得考虑的。从你的代码可以看出,有些地方说明你对后置动作理解的不够深。
#3
makebest2010-10-15 22:27
后置++好玩吗, 最好还是不用.
#4
m21wo2010-10-15 22:46
2楼正解!是“基于前置增量实现后置增量”的方法!
#5
sock2582010-10-16 12:17
回复 2楼 pangding
是更笨不了解啊, 像对象a=b 修改对象b中的内容,a对象为什么不会改变的啊,不是说他们指向同一地址的么?
#6
m21wo2010-10-16 14:24
Increase Increase::operator++(int)
{
    Increase tmp(*this);
    ++*this;
    return tmp;
}
你没看到看到是先 用tmp 记下 *this的值,再对*this加1,最后返回的是原先*this的值即tmp。所以还会出现有后置++的特点啊,表达式的值不变,可*this本身的值已加1
#7
Tveiker2010-10-16 14:54
上楼正解
#8
yangang22010-10-16 16:06
回复 楼主 sock258
楼主要注意稍微改一下:
Increase Increase::operator++(int)
{
    Increase tmp(*this);
    ++value;//是将成员变量自加,还有要注意返回值只能按值返回,因为tmp是临时对象,按别名返回会存在引用一个并不存在的对象而出错,会输出一个随机数
    return tmp;
}
#9
pangding2010-10-16 18:27
楼主有一概念可能不是很清楚,后置值是一个临时值。

这在 C 语言里也是这么规定的,只不过标准是用左右值的说法来描述这个问题。我一般不倾向于这么描述,但这么说确实比较严谨。
前置表达式是一个左值,后置的表达式是一个右值。

这种写法当定式记下来也可以的,一般来说总有:
obj & operator++();
obj operator++(int);
#10
kspliusa2010-10-16 20:19
可以看看《STL源码剖析》, 里面有讲这方面的内容。
#11
pangding2010-10-16 21:03
那个书里讲的主题就比较多了,其实不推荐初学者看。語法如果不是很熟练的话,看那个比较费力。
但有一定基础的人,我觉得可以看看。如果能理解一二,长进还是比较大的。
1