自己在做项目遇到了这个问题,直接贴大佬的见解。
转自:http://www.cppblog.com/zhenglinbo/archive/2011/12/18/162334.html?opt=admin
运算符重载函数一般采用两种形式,一种是定义为类的成员函数,另一种是定义为类的友元函数。
大多数情况下,使用成员函数和友元函数重载运算符在功能实现上是相同的,重载时如果没有本质的区别,则应该首先考虑使用成员函数以保证数据封装。然而在某些情况下,如C++不能直接进行复数加、减、乘、除的四则运算,但是使用友元函数就可以实现重载这些运算符。
如 定义
class complex
{
public:
complex(){real=imag=0;}
complex(double r,double i)
{
real=r,imag=r;
}
friend complex operator+(const complex &c1,const complex &c2)
{
return complex(c1.real+c2.real,c1.imag+c2.imag);
}...
!注意友元运算符函数的参数类型是引用类型!
一般而言,以下两种调用方法是等价的:
aa@ bb //隐式调用
operator @ (aa,bb) // 显式调用
@为运算符
在实际开发过程中,单目运算符建议重载为成员函数,而双目运算符建议重载为友元函数。通常下双目运算符重载为友元函数比重载为成员函数更方便,但是有时双目运算符必须重载为成员函数,例如赋值运算符。
再写模板类的友元重载 怎么写都不对 后来参考了该写法 有空再探究原因
函数在类内用下面语句声明 注意这里要用不同的模板参数 U
template <class U>
friend CMat<U> operator*(CMat<U>&,CMat<U>&); //矩阵乘法
类外定义如下 其他参考个人写的模板矩阵类
CMat<U> operator*(CMat<U>&mat1, CMat<U>&mat2)
{
}