C++ 用户定义类型的增量后运算符';行为

C++ 用户定义类型的增量后运算符';行为,c++,g++,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; } i

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

#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;
}   
#包括
使用名称空间std;
X类
{
INTA;
公众:
X(intx=1):a(X){}
X运算符++(int)
{
X oldobj=*这个;
(*此).a++;
返回oldobj;
}
int get(){返回一个;}
};
int main()
{
X obj,obj2;
obj++=obj2;

cout正如语法所告诉的,后缀运算符返回旧值的副本,因此递增的是旧值,而不是对象

基本上

obj++ = obj2;
我们将这样做:

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

您正在将
obj2
赋值给一个临时变量。

该行为实际上是定义良好的

您正在为
obj++
的结果赋值,该结果是一个临时值,是post increment之前的
obj
的副本。此赋值不影响
obj
,后者保留其增量值
2

代码大致相当于:

X temp = obj;
obj++;
temp = obj2;

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

因此,虽然“
obj2
的值在增量完成后将被复制”是真的,但它根本没有复制到原始的
obj

(*这)。a++
通常被写成
这->a++
(或者只是
a++