操作超载*(左侧和右侧)

时间:2016-05-29 12:37:34

标签: c++ operator-overloading

我有一个Mat类

class Mat
{
 ..
..
..
   friend Mat& operator*(Mat s1,int elem){
     s1.multiWith(elem);
     return s1;
}
};

现在它将起作用 M1 * 2 但是如何使它工作 2 * M1

2 个答案:

答案 0 :(得分:3)

a*b运算符应该返回一个新对象,而不是对a的引用。

在类中声明operator*的正确语法是:

class Mat
{
   ..
   ..
   ..
   Mat operator*(int elem){
        Mat res = *this;
        res.multiWith(elem);
        return res;
   }
};

然后,左参数的类型必然是当前类(此处:a*b的左参数必然是Mat实例)。

现在,如果您在类外声明运算符,则可以为左右参数选择任何类型:

class Mat
{

};

Mat operator*(const Mat& left,int right){
     Mat res;
     // do res=left*elem
     return res;
}

Mat operator*(int left,const Mat& right){
     Mat res;
     // do res=left*right
     return res;
}

答案 1 :(得分:1)

  

现在它适用于m1 * 2,但如何使其适用于2 * m1

为它提供另一个重载。

class Mat
{
..
    friend Mat operator*(const Mat& s1, int elem) {
        Mat ret = s1;
        ret.multiWith(elem);
        return ret;
    }
    friend Mat operator*(int elem, const Mat& s1) {
        return s1 * elem;
    }
};

BTW1:operator*应该按值返回Mat,而不是按引用返回 BTW2:您可能希望将s1的参数类型更改为const引用以避免复制 BTW3:如果Mat::multiWith不是private operator*,则不一定是friend