运营商" +" overload返回零数组

时间:2018-04-18 16:50:32

标签: c++

我有一个简单的算子+重载方法,用于类Macierz,它应该从对象获得2d矩阵变量,并将所有这个矩阵变量与另一个Macierz对象的相同字段相加。

Macierz & operator + (Macierz &f) {
    Macierz newM;

    for (int i = 0; i < length; i++)
        for (int j = 0; j < length; j++) 
            newM.macierz[i][j] = macierz[i][j] + f.macierz[i][j];


    return newM;
}

计算工作正常。显示newM变量会产生正确的值,但是当我尝试使用它时:

float y[3][3] = { {1.00f, 2.00f, 3.00f}, { 4.00f, 5.00f, 6.00f }, { 7.00f, 8.00f, 9.00f } };
Macierz m5(y); //fill m5 array with values from above
    Macierz m2(2.00f); //fill m2 entirely with 2.00f values

    cout << m2 + m5;

结果是一个零数组。

怎么会发生这种情况? macierz变量是一个简单的float[3][3]字段。

任何帮助都会很棒

1 个答案:

答案 0 :(得分:5)

  

结果是一个零数组。

您正在返回对函数局部变量的引用。函数返回后,引用将成为悬空引用。因此,您的程序具有未定义的行为。

将函数更改为按值返回。

// Remove the reference type specifier
//     |
//     v 
Macierz operator + (Macierz &f) {
    Macierz newM;
    ...
    return newM;
}

我建议对该功能进行进一步的改进。

  1. 将其更改为const成员函数。
  2. 将参数类型更改为const&
  3. 通过这些更改,您也可以使用const对象来使用该功能。

    Macierz operator + (Macierz const& f) const {
        Macierz newM;
        ...
        return newM;
    }
    

    相关帖子:Is it okay to use an overloaded operator to implement another operator overload?