三行代码  ›  专栏  ›  技术社区  ›  Pooyanoss

覆盖类的堆栈分配实例

  •  0
  • Pooyanoss  · 技术社区  · 2 月前

    考虑下面的代码:

    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. 我不知道?

    非常感谢。

    1 回复  |  直到 2 月前
        1
  •  4
  •   eerorika    2 月前

    为什么会这样?

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

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

    它做到了。

    从而改变了a的新地址。

    它没有那样做。由创建的临时对象 A() 有一个新地址,但在完整表达式结束时,临时对象被销毁。 A. 保持它原来的位置,然后用临时对象作为参数调用它的赋值运算符。

        2
  •  0
  •   shargors    2 月前

    变量a在堆栈上分配。在整个活动期间,它的地址不会改变。类A的第一个和第二个实例将在所占用的空间中创建,但变量除外。

    推荐文章