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

operation overloading * (both left side and right side)

本文关键字:操作      更新时间:2023-10-16

我有一个类Mat

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

现在它将适用于m1*2但是如何使其与2*m1

现在它将适用于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的参数类型更改为常量引用
BTW3:如果Mat::multiWith不是private,则operator*不必是friend

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;
}