考虑以下代码:
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我不知道的静态覆盖方法?
谢谢你!
为什么会这样呢?
在其生命周期范围内,变量恰好是一个完整的对象(递归情况除外,在这种情况下,存在变量的多个重叠实例)。a从声明到函数返回,这里都是同一个对象。
我预计第二次调用 A() 会通过创建 A 的新实例来覆盖变量 a,
它做到了。
从而改变a的新地址。
它没有这样做。创建的临时对象A()有一个新地址,但该临时对象在完整表达式结束时被销毁。a保留在原来的位置,并使用临时对象作为参数调用其赋值运算符。