操作符重载
想写个3*3矩阵的类,写到操作符重载,有点比较纠结:
矩阵与实数和乘法,数据类型定义为public,所以我认为有两种写法:
1、成员函数:Matrix3_3 operator * (const double&);
2、非成员函数:Matrix3_3 operator * (const Matrix3_3&,const double&);
问题来了,如果是第二种写法,我是不是还要这样定义一下:
Matrix3_3 operator * (const double&,const Matrix3_3&);
也就是说,如果我只定义了上面的,那么:
Matrix3_3 M1;
// 赋值初始化M1
double x = 1.41421;
Matrix3_3 M2 = x * M1;
会不会报错呢,我说的不是某一些编译器,是针对所有编译器。
[解决办法]
Matrix3_3 operator * (const Matrix3_3&,const double&);
Matrix3_3 operator * (const double&,const Matrix3_3&);
两个都需要定义,只不过只要严格的定义一个就可以了。因为你可以在另一个里面把参数给互换下,返回。OK啦。
楼主为什么把数据类型设置为public呢?为什么不使用友元函数呢?
[解决办法]
Matrix3_3 operator * (const Matrix3_3&,const Matrix3_3&);
Matrix3_3 operator (double r)//转换构造函数
{
.......
}
有了这两个函数在执行Matrix3_3 M2 = x * M1;时,编译器把他变换为
Matrix3_3 M2 = operator *(x ,M1);由于其中有一个不是类类型,那么就会调用转换构造函数,
将其转换成类类型。。。然后就可以计算了。。。。这样就不需要管类值类型在前面还是在后面了,即满足交换律。。。详细请看谭浩强C++程序设计341页。。。。。。。