运算符"+"重载返回零数组

aln*_*447 0 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;
}
Run Code Online (Sandbox Code Playgroud)

计算工作正常.显示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;
Run Code Online (Sandbox Code Playgroud)

结果是一个零数组.

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

任何帮助都会很棒

R S*_*ahu 5

结果是一个零数组.

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

将函数更改为按值返回.

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

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

  1. 将其更改为const成员函数.
  2. 将参数类型更改为a const&.

通过这些更改,您也可以使用使用const对象的功能.

Macierz operator + (Macierz const& f) const {
    Macierz newM;
    ...
    return newM;
}
Run Code Online (Sandbox Code Playgroud)

相关帖子:是否可以使用重载运算符来实现另一个运算符重载?.