我正在阅读一些书,我决定为用户定义的类型编写自己的后增量运算符实现。这是代码。
#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
;
行为是否未定义?
答案 0 :(得分:4)
正如你的语法告诉你的那样,后缀运算符会返回旧值的副本,这样就会增加,而不是你的对象。
基本上,
obj++ = obj2;
会这样做:
X tempObj = obj;
obj ++;
tempObj = obj2;
您将obj2
分配给临时变量。
答案 1 :(得分:2)
obj++
返回一个保存旧值的临时对象。
因此,虽然“增量完成后将复制”obj2
的值“为真,但它根本不会复制到原始obj
中。)
答案 2 :(得分:1)
行为实际上定义明确。
您正在分配obj++
的结果,这是一个临时的 - 来自后增量之前的obj
的副本。此分配不会影响obj
,2
会从增量中保留其值X temp = obj;
obj++;
temp = obj2;
。
代码大致相当于:
{{1}}