我有一个Mat类
class Mat
{
..
..
..
friend Mat& operator*(Mat s1,int elem){
s1.multiWith(elem);
return s1;
}
};
现在它将起作用 M1 * 2 但是如何使它工作 2 * M1
答案 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
。