编写高质量代码——运算符重载,是成员函数还是友元函数

一、运算符重载的四项基本原则:

▍不可臆造运算符。

▍运算符原有操作数的个数、优先级和结合性不能改变。

▍操作数中至少一个是自定义类型。

▍保持运算符的自然含义。

==============================

二、运算符重载的两种形式:

成员函数形式(隐含一个参数 this 指针)

1)双目运算符:参数一个

2)单目运算符:不能显示的声明参数

友元函数形式(不存在隐含的参数 this 指针)

1)双目运算符:两个参数

2)单目运算符:一个参数

==============================

三、成员函数和友元函数形式的另一差异:

1)友元函数形式:能够接受左参数和右参数的隐式转换

2)成员函数形式:只允许右参数的隐式转换

例如:

class CString{

   public :

      CString(char* str);

      ...

   private :

      char* m_pStr;

};

=.=CString的构造函数参数为一个char:

友元函数形式的 operator+(const CString&,const CString&),char+CString和CString+char都能正常工作;

成员函数形式的 CString::operator(const CString& rhs),只能执行 CString+char。

--------------------------------

隐式转换由于临时变量的增加,效率不高,建议定义多个运算符的友元重载版本:

CString& operator+(const CString&, const CString&); 

CString& operator+(const char&, const CString&);

CString& operator+(const CString&, const char&);

==============================

四、一般而言,双目运算符,最好重载为友元函数;对于单目运算符,最好重载为成员函数。

特例:

1)只能重载为成员函数:“=”、“()”、“[ ]”、“->”等,与 this(自身)关联太多。

2)只能重载为友元函数:只能重载为友元函数:输出运算符 << ,第一个操作符一定是 ostream 。

friend ostream& operator<<(ostream& out, const Complex& c);

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值