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


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

    ▍不可臆造运算符。

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

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

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

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

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

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

  • 相关阅读:
    特性类
    WebGL中的第三个小程序(着色器)
    C#紧耦合的例子
    特性
    python两个目录匹配,粘贴图片
    Leetcode 53
    逻辑回归-1.原理
    多项式回归-4.模型正则化
    python 线程
    python 进程
  • 原文地址:https://www.cnblogs.com/lidabo/p/16242360.html
Copyright © 2020-2023  润新知