"this" 参数化构造函数中的指针指向另一个地址而不是外部地址

"this" pointer in parameterized constructor points to another address than from outside

我有以下代码:

#include <iostream>

class Entity {

public:
    int x;
    int y;

    Entity() {
        std::cout << "Default contructor: " << this << std::endl;
    }

    Entity(int x, int y) {
        this->x = x;
        this->y = y;

        std::cout << "Constructor with parameter: " << this << std::endl;
    }
};

int main()
{
    Entity e;
    e = Entity(10, 20);

    std::cout << "Adress from outside: " << &e << std::endl;

    std::cin.get();

    return 0;
}

为什么main函数中的地址和默认构造函数中的地址一样?有什么方法可以访问使用 main?

中的参数初始化的对象的内存地址

Why is the address in the main fuction the same as the address in the default constructor?

因为e始终是同一个对象。你不能在内存或类似的东西中移动它。它会占据同一个记忆点直到它死去。
您在 e = Entity(10, 20); 中使用的是 移动赋值运算符 。请注意,尽管名称如此,但实际上并没有移动任何东西,因为它不能那样做。默认编译器生成的移动赋值运算符仅对每个 class 成员调用移动赋值(并且 int 的移动赋值相当于一个副本)。

And is there any way to get access to the memory address of the object initialized with parameters from main?

没有。那个对象是临时的,在分号结束这一行之后它就消失了。您需要为其命名以将其保留为另一个变量。

Why is the address in the main fuction the same as the address in the default constructor?

因为main函数中的对象是使用默认构造函数初始化的

“this” pointer in parameterized constructor points to another address than from outside

这是因为参数化构造函数用于初始化不同的对象。即,它用于初始化用于分配 main 中对象值的临时对象。由于这两个对象具有重叠的生命周期并且不是彼此的子对象,因此它们必须具有不同的地址。

And is there any way to get access to the memory address of the object initialized with parameters from main?

临时对象的生命周期结束于它在 中的完整表达式(在本例中为分号)(除非通过绑定到具有更长生命周期的引用来扩展它,这不会'此处不适用)。因此,您之后无法使用它。您可以使用变量而不是临时变量来访问它:

Entity e;
Entity e2(10, 20);
e = e2;