覆盖 class 的堆栈分配实例
Overwrite stack-allocated instance of a class
考虑以下代码:
class A{
public:
A(){};
};
int main(){
A a = A();
std::cout << &a << std::endl;
a = A();
std::cout << &a << std::endl;
return 0;
}
两个地址相同。我预期的行为是第二次调用 A()
会通过创建 A 的新实例来覆盖变量 a
,从而更改 a
.
的新地址
为什么会这样?有没有办法静态覆盖我不知道的 a
?
谢谢!
Why is this so?
在其生命周期范围内,一个变量恰好是一个完整的对象(递归除外,在这种情况下,变量有多个重叠实例)。 a
这里是同一个对象,从它的声明到函数的 return。
I expected was that the second call to A() would overwrite the variable a by creating a new instance of A,
它做到了。
thereby changing the new address of a.
它没有那样做。 A()
创建的临时对象有一个新地址,但该临时对象在完整表达式的末尾被销毁。 a
保持原样,您以临时对象作为参数调用了它的赋值运算符。
变量a分配在栈上。它的地址在函数执行期间不会改变。 class的第一个和第二个实例A会在space中创建但占用了变量。
考虑以下代码:
class A{
public:
A(){};
};
int main(){
A a = A();
std::cout << &a << std::endl;
a = A();
std::cout << &a << std::endl;
return 0;
}
两个地址相同。我预期的行为是第二次调用 A()
会通过创建 A 的新实例来覆盖变量 a
,从而更改 a
.
为什么会这样?有没有办法静态覆盖我不知道的 a
?
谢谢!
Why is this so?
在其生命周期范围内,一个变量恰好是一个完整的对象(递归除外,在这种情况下,变量有多个重叠实例)。 a
这里是同一个对象,从它的声明到函数的 return。
I expected was that the second call to A() would overwrite the variable a by creating a new instance of A,
它做到了。
thereby changing the new address of a.
它没有那样做。 A()
创建的临时对象有一个新地址,但该临时对象在完整表达式的末尾被销毁。 a
保持原样,您以临时对象作为参数调用了它的赋值运算符。
变量a分配在栈上。它的地址在函数执行期间不会改变。 class的第一个和第二个实例A会在space中创建但占用了变量。