ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

运算符重载,是成员函数还是友元函数

2022-05-07 14:34:40  阅读:141  来源: 互联网

标签:友元 char const 函数 CString 运算符 重载


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

▍不可臆造运算符。

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

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

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

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

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

▍成员函数形式(隐含一个参数 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);

标签:友元,char,const,函数,CString,运算符,重载
来源: https://www.cnblogs.com/lidabo/p/16242360.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有