在C++中重新分配对象变量时,原始对象会发生什么?

naa*_*vis 8 c++ memory stack memory-management

在C++中重新分配对象变量时,原始值会发生什么变化?在下面的代码中,对象被创建到堆栈上并放在变量中.然后在堆栈上创建一个新对象并将其放在同一个变量中.原始对象会发生什么?在变量超出范围之前,它是否会保留在堆栈中?

void foo() {
    ClassName variable(a, b); // variable created on the stack
    variable = ClassName(c, d); // new value for variable created on stack
    ...
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*ler 10

会发生什么是调用类的赋值运算符.在大多数情况下,这意味着旧对象的内容使用新对象的值进行更新.所以如果ClassName是:

struct ClassName
{
    int a;
    int b;

    ClassName(int a, int b) : a(a), b(b) {}
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将调用默认赋值运算符,它等效于:

    ClassName& operator=(const ClassName& other)
    {
        a = other.a;
        b = other.b;
        return *this;
    }
Run Code Online (Sandbox Code Playgroud)

对于具有动态内容的类,可能会有更多事情要做,但结果通常是相同的.由于赋值运算符可以被覆盖,理论上可以发生任何事情,但这正是我们所期望的.