成员函数通过其左侧参数(即 this 指针)进行匹配。由于本机类型不能具有成员函数,因此您必须通过非成员函数(对于您没有写入访问权限的其他类型)添加用户定义类型的右乘。
template<typename T>
Matrix<T> operator*(T const& scalar, Matrix<T> rhs)
{
// scalar multiplication is commutative: s M = M s
return rhs *= scalar; // calls rhs.operator*=(scalar);
}
NOTE: 以上是我写的非会员operator*
以会员的方式实施operator*=
。建议将所有乘法编写为非成员函数,并使用成员函数operator*=
使用 lhs 矩阵元素实现这些乘法。
这将 a) 保持类接口最小化,b) 防止隐藏转换。例如。如果尺寸为 1x1,您可以拥有一个可隐式转换为标量的 Matrix 类,并且如果您不提供直接匹配的单独重载,这些转换可能会默默发生。
template<typename T>
Matrix<T> operator*(Matrix<T> lhs, T const& scalar)
{
return lhs *= scalar; // calls lhs.operator*=(scalar);
}
template<typename T>
Matrix<T> operator*(Matrix<T> lhs, Matrix<T> const& rhs)
{
return lhs *= rhs; // calls lhs.operator*=(rhs);
}
请注意 lhs 矩阵是副本而不是引用。这允许编译器进行优化,例如复制省略/移动语义。另请注意,这些运算符的返回类型是Matrix<T>
并不是const Matrix<T>
这是一些旧 C++ 书籍中推荐的,但它阻止了 C++11 中的移动语义。
// class member
template<typename T>
Matrix<T>& Matrix<T>::operator*=(Matrix<T> const& rhs)
{
// your implementation
return *this;
}
// class member
template<typename T>
Matrix<T>& Matrix<T>::operator*=(T const& scalar)
{
// your implementation
return *this;
}