提问人:SushiWaUmai 提问时间:5/9/2021 更新时间:5/9/2021 访问量:179
参数化构造函数中的“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
答:
4赞
Yksisarvinen
5/9/2021
#1
为什么主函数中的地址与默认构造函数中的地址相同?
因为总是同一个对象。你不能在内存或类似的东西中移动它。它将占据相同的记忆点,直到它死去。
您正在使用的称为移动赋值运算符。请注意,尽管有这个名字,但实际上什么都没有移动,因为它不能这样做。默认编译器生成的移动赋值运算符只是对每个类成员调用移动赋值(ints 的移动赋值等同于副本)。e
e = 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;
下一个:返回对调用对象的引用 (C++)
评论
e
Entity e{10, 20};