【问题标题】:Destructor is called in operator overloading [duplicate]在运算符重载中调用析构函数[重复]
【发布时间】:2017-03-12 01:28:12
【问题描述】:

这是我的代码。问题是我在析构函数中将类数组分配为零,当我在程序中进行运算符重载时,调用析构函数并且我的数组自动分配为 0。

    //Overloading Plus Operator
Array Array::operator +(Array &obj)
{
    for (int i = 0; i < 10; i++)
    {
        this->arr[i] = this->arr[i] + obj.arr[i];
    }

    return *this;
}

//Overloading Minus Operator
Array Array::operator -(Array obj)
{
    for (int i = 0; i < 10; i++)
    {
        this->arr[i] = this->arr[i] - obj.arr[i];
    }

    return *this;
}

//Overloading Assignment Operator
void Array::operator =(Array &obj)
{
    for (int i = 0; i < 10; i++)
    {
        arr[i] = obj.arr[i];
    }

}


//Class Destructor
Array::~Array()
{
    cout << "\n\nDeleting Object " << this->objNum << "\n";
    for (int i = 0; i < 10; i++)
    {
        arr[i] = 0;
    }
    cout << "\n\n";
}

【问题讨论】:

  • 您正在返回“this”的副本。
  • @FedeWar 那么如何解决这个问题呢?
  • 我们需要一个最小的工作示例。
  • 要么通过引用返回并调用函数operator+=,要么停止处理this
  • @FedeWar 这是我完整代码的链接anotepad.com/notes/353akc

标签: c++ oop operator-overloading destructor operator-keyword


【解决方案1】:

当你陷入这样的困境时,有时这是你做错了什么的重要线索。

你就是。

你正在实现的函数是operator+,其含义一般是x+y应该保持xy不变,并产生一个新的对象,其值为它们的总和......

但是,您的实现更像x += y 的实现:将x 的值更改为其原始值和y 之和的操作。

您看到的问题是这种不匹配的症状。

顺便说一句,你的函数也是 const 不正确的——例如,要修复这个问题,将 operator+ 声明为

 Array operator +(const Array &obj) const

事实上,如果您另外声明了一个 const 正确的 operator[] 并访问了内部数组的内容并使用此运算符访问了数组的内容,编译器会提示您以下事实:您不应该不要修改operator+中的数组内容。

【讨论】:

  • 在这里使用 const 有什么好处?
  • @Saad:一个好处是编译器强制执行该函数不应该修改标记为const 的内容的约定,这可能会让您陷入此处的错误。还有其他事情——比如当xconst时实际上能够做x+y..“常量正确性”是你应该做的事情;你可以去查一下。
  • 感谢您的更正,但它还没有工作。我使用了 const 和第三个对象来存储 x+y 但输出是相同的。仍然调用析构函数,数组分配为 0。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2011-10-11
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2013-10-08
  • 2013-03-26
  • 2017-04-04
相关资源
最近更新 更多