覆盖堆栈分配的类实例

Poo*_*oss 0 c++ memory c++17

考虑以下代码:

class A{
    
  public:
    A(){};
    
};

int main(){
    
    A a = A();
    std::cout << &a << std::endl;
    
    a = A();
    std::cout << &a << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两个地址是相同的。我预期的行为是,第二次调用A()将通过创建 A 的新实例来覆盖变量a,从而更改 的新地址a

为什么会这样呢?有没有一种a我不知道的静态覆盖方法?

谢谢你!

eer*_*ika 5

为什么会这样呢?

在其生命周期范围内,变量恰好是一个完整的对象(递归情况除外,在这种情况下,存在变量的多个重叠实例)。a从声明到函数返回,这里都是同一个对象。

我预计第二次调用 A() 会通过创建 A 的新实例来覆盖变量 a,

它做到了。

从而改变a的新地址。

它没有这样做。创建的临时对象A()有一个新地址,但该临时对象在完整表达式结束时被销毁。a保留在原来的位置,并使用临时对象作为参数调用其赋值运算符。