乘法运算符正在改变原始值

时间:2014-09-15 10:02:49

标签: c++ operator-overloading

如何在不更改原始值的情况下创建将执行乘法的运算符?

Matrix3 & operator*(const Matrix3 &matrix)
{
     //do multiplication

     return *this;
}

因此...

Matrix3 m1 = Matrix3(1, 2, 3, 3, 2, 1, 2, 1, 3);
Matrix3 m2 = Matrix3(4, 5, 6, 6, 5, 4, 4, 6, 5);

Matrix3 mNew = m1 * m2; <--- mNew is now correct, but it has also changed m1

这种行为完全是预期的并且绝对有意义,但我怎样才能避免它发生?

我想通过m1多次m2并保持不变,只更新mNew。我想我想要一个带有2个参数的方法(类似于这个线程中的运算符 - &gt; [simple c++: How to overload the multiplication operator so that float*myClass and myClass*float works)但我找不到我的编译器允许的可接受的定义。

3 个答案:

答案 0 :(得分:3)

operator*的实现应该是operator*=的成员函数,这将改变左值;并添加一个非成员函数operator*,它不会更改原始值:

class Matrix3 {
public:
    Matrix3 & operator*=(const Matrix3 &matrix)
    {
        //do multiplication

        return *this;
    }    
};

Matrix3 operator*(const Matrix3 &matrix1, const Matrix3 &matrix2)
{
    Matrix3 m( matrix1 );
    return m *= matrix2;
}

DEMO

请注意,此处operator*是一个非成员函数,因此它具有在其左侧和右侧参数上接受相同隐式转换的理想属性。并且总是希望通过最小化依赖性来使函数成为非成员非友人以改进封装。

答案 1 :(得分:1)

&#39;扩展Oliver的评论:

Matrix3 operator*(const Matrix3 &matrix) const
{
     Matrix3 copy(*this);

     //do multiplication

     return copy;
}

答案 2 :(得分:1)

您尝试做的操作确实有意义,但是您不应该通过引用返回来完成它,这没有任何意义。通过引用返回的问题是*运算符正在创建一个新对象。

我建议您将代码更改为以下内容:

//Notice no return by reference here
Matrix3 operator*(const Matrix3 &matrix)
{
 //Copy my local object into a temp instance variable
 Matrix3 m = *this;
 return m *= matrix;
}

//Notice return by reference here
Matrix3& operator*=(const Matrix3 &matrix)
{
 //Multiple matrix to *this
 return *this;
}

基本上,您正在创建一个实例变量,用对象的内容填充它,进行乘法运算,返回实例变量。