用于用户定义类型行为的后递增运算符

时间:2011-11-08 09:58:12

标签: c++ g++

我正在阅读一些书,我决定为用户定义的类型编写自己的后增量运算符实现。这是代码。

#include <iostream>

using namespace std;

class X
{
    int a;

    public:
    X(int x=1):a(x){}

    X operator++(int)
    {
        X oldobj = *this;
        (*this).a++;
        return oldobj;
    }

int get(){return a;}

};

int main()
{
    X obj,obj2;
    obj++ = obj2;
    cout<< obj.get() << endl;
    return 0;
}   

我希望输出为1,因为在完成增量后会复制obj2的值。但输出是2

思想?

P.S。我知道这段代码不会赢得任何奖牌及其谬误。这只是为了我的理解。顺便提一下,++obj = obj2会返回1;

行为是否未定义?

3 个答案:

答案 0 :(得分:4)

正如你的语法告诉你的那样,后缀运算符会返回旧值的副本,这样就会增加,而不是你的对象。

基本上,

obj++ = obj2;

会这样做:

X tempObj = obj;
obj ++;
tempObj = obj2;

您将obj2分配给临时变量。

答案 1 :(得分:2)

obj++返回一个保存旧值的临时对象。

因此,虽然“增量完成后将复制”obj2的值“为真,但它根本不会复制到原始obj中。)

答案 2 :(得分:1)

行为实际上定义明确。

您正在分配obj++的结果,这是一个临时的 - 来自后增量之前的obj的副本。此分配不会影响obj2会从增量中保留其值X temp = obj; obj++; temp = obj2;

代码大致相当于:

{{1}}