在容器上使用重载运算符

Using overloaded operator on container

本文关键字:重载 运算符      更新时间:2023-10-16

我有一个简单的类,它包含整数数组。我想重载+将两个拉里合并在一起。我定义了两个重载程序。+和=

class Money{
    Money & operator =( const Money &a )
    {
        for( int i = 0; i < size ;i++ ) arr[i] = a.arr[i];
        return *this;
    }
    Money & operator +( const Mone &a )
    {
        Money temp;
        for( int i = 0; i < size  ;i++ ){
            temp.arr[i] =  arr[i] + a.arr[i];
        }
        return temp;
    }
private:
  int arr[50];
  int size = 50;
}

问题是索引0,它从内存中返回随机数。我看到了一些关于类似问题的问题,但使用*运算符(我会尝试找到它并链接它),我的运算符=来自哪里。是什么原因造成的?我调用它作为

Money a;
Money b;
Money d;
d = a + b;
// print array;

我是超载的新手,所以我很难分析和理解这个概念。

基本问题就在这里,与重载无关:

Money & operator +( const Mone &a ) {
    Money temp;
        :
    return temp;

问题是,您返回了对局部变量的引用,当函数返回时,局部变量会被破坏,因此是一个悬空引用,从而导致未定义的行为。

将其更改为按值返回Money

根据我对operator+中的问题的理解,您正在创建一个临时变量temp。该变量将一直存在,直到"operator+"的代码完成。当您返回对该变量id的引用时,当代码完成时,它本质上是一个指向它的隐藏指针,该引用不再有效。如果您更改代码并按值返回,那么一切都应该正常工作。相反,对于=运算符来说,情况是正确的,因为您返回的引用绑定到一个将在"operator="调用结束后存在的对象。