将类运算符重载变为友元函数

自己在做项目遇到了这个问题,直接贴大佬的见解。

转自: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)
{
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值