覆盖 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中创建但占用了变量。