赋值运算符在不应该返回“空”实例时返回?

时间:2016-08-26 02:18:29

标签: c++ pointers reference operator-overloading assignment-operator

我正在实施一个专门用于练习的堆栈。所以,总的来说,我有这样的事情:

Stack stack;
stack.push(element1;
stack.push(element2);

Stack copy;
copy = stack;

所以我正在重载赋值运算符,因为我也想生成新的元素实例(而不只是将每个元素的指针从一个复制到另一个),如下所示

Stack &Stack::operator=(const Stack &toCopy) {
    Stack* stack = new Stack;
    if (toCopy.first == NULL) return *stack;
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        stack->push(actual->elem);
    }
    // In this state, *stack has 2 elements as it should
    return *stack;
}

回到main中,copy变量没有得到更改......它仍然是空的,好像从未发生过赋值一样。好像我只做了Stack copy;你能解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:3)

您没有修改当前对象(即*this)。

您只是按new创建一个新对象,然后返回它。请注意copy = stack;,它等同于copy.operator=(stack);,请注意,未使用返回的值,它只是被丢弃(并导致内存泄漏),copy不会更改。

您应该执行以下操作:

Stack &Stack::operator=(const Stack &toCopy) {

    // do some work to clear current elements in *this
    // ...

    // add elements from toCopy
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        this->push(actual->elem);
    }

    // operator= is supposed to return *this in general
    return *this;
}

答案 1 :(得分:2)

您可能误解了赋值运算符。它在等号左边的对象的上下文中工作。因此,::operator=(...)应始终在*this上工作,并且应始终返回*this

您发布的operator=(...)正在您已在堆上分配的堆栈对象上运行,而您正在 it 上运行而不是*this

您可以在代码中用stack有效替换this。即:

Stack &Stack::operator=(const Stack &toCopy) {
    //Stack* stack = new Stack; // Don't do this.
    if (toCopy.first == NULL) return *this;
    for (Node* actual = toCopy.first; actual != NULL; actual = actual->sig) {
        this->push(actual->elem); // You could also just call push without "this->"
    }
    // In this state, *stack has 2 elements as it should
    return *this;
}