微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有以下代码

#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 中的参数初始化的对象的内存地址吗?

解决方法

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

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

有什么办法可以访问用main参数初始化的对象的内存地址吗?

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

,

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

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

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

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

有什么办法可以访问用main参数初始化的对象的内存地址吗?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。