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

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

提问人:SushiWaUmai 提问时间:5/9/2021 更新时间:5/9/2021 访问量:179

问:

我有以下代码:

#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

C++ 指针 内存地址

评论

2赞 MatG 5/9/2021
因为是默认构造的,然后分配给右值,所以请尝试eEntity e{10, 20};

答:

4赞 Yksisarvinen 5/9/2021 #1

为什么主函数中的地址与默认构造函数中的地址相同?

因为总是同一个对象。你不能在内存或类似的东西中移动它。它将占据相同的记忆点,直到它死去。
您正在使用的称为移动赋值运算符。请注意,尽管有这个名字,但实际上什么都没有移动,因为它不能这样做。默认编译器生成的移动赋值运算符只是对每个类成员调用移动赋值(ints 的移动赋值等同于副本)。
ee = Entity(10, 20);

有没有办法访问使用 main 中的参数初始化的对象的内存地址?

不。该对象是临时的,在完成这一行的分号之后就消失了。您需要给它一个名称以将其保留为另一个变量。

评论

0赞 Kevin 5/9/2021
它不会是移动分配操作员吗,因为它是临时的?在这种情况下,这并不重要,因为复制和移动对于此类是等效的。
1赞 Yksisarvinen 5/9/2021
@Kevin 没错,但“移动”这个名字可能有些误导,尤其是在这个问题的背景下。我会尝试在 tho 中编辑它。
2赞 eerorika 5/9/2021 #2

为什么主函数中的地址与默认构造函数中的地址相同?

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

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

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

有没有办法访问使用 main 中的参数初始化的对象的内存地址?

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

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