美文网首页C++
C++运算符重载形式--成员函数or友元函数?

C++运算符重载形式--成员函数or友元函数?

作者: CurryCoder | 来源:发表于2019-04-15 10:33 被阅读21次

1.C++操作符重载形式---成员函数or友元函数

  • 1.对运算符重载,需要坚持四项基本原则:
    • 不可臆造运算符;
    • 运算符原有操作数的个数、优先级和结合性不能改变;
    • 操作数中至少一个是自定义类型;
    • 保持重载运算符的自然含义。
  • 一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。
    • 当重载为成员函数时,会隐含一个this指针;当重载为友元函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数
    • 当重载为成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换
  • 如下代码:
        class String{
            public:
                String(char *str);
            private:
                char *ptr;
        };
    
  • 因为String的构造函数参数为一个char*,所以如果采用友元形式的friend String operator+(const String &A, const String &B),那么char+String和String+char都能正常工作;而如果采用成员函数形式String::operator+(const String &A),则只能接受String+char,如果执行char+String则会编译出错。我们往往习惯String+char和char+String都应该被接受。需要注意的是,隐式转换由于临时变量的增加往往效率不高。如果应用程序对效率要求较高,针对以上类,建议选择定义多个运算符的友元重载版本:
        String & operator+(const String &A, const String &B);
        String & operator+(const char *str, const String &B);
        String & operator+(const String &A, const char *str);
    
  • 一般而言,对于双目运算符,最好将其重载为友元函数;而对于单目运算符,则最好重载为成员函数。但是也存在例外情况。有些双目运算符是不能重载为友元函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。比如=表示“将自身赋值为…”,[]表示“自己的第几个元素”,如果将其重载为友元函数,则会出现语义上的不一致。还有一个需要特别说明的就是输出运算符<<。因为<<的第一个操作数一定是ostream类型,所以<<只能重载为友元函数,如下:
        friend ostream & operator <<(ostream &os, const Complex &c);
        ostream& operator <<(ostream &os, const Complex &c)
        {
            os << c.m_Real << “+” << c.m_Imag << “i” << endl;
            return os;
        }
    

2.参考博客

相关文章

  • C++ 重载 [] = == !=

    一 重载 [] = == != 1.1 重载[] C++ 规定,下标运算符[ ]必须以成员函数的形式进行重载。该重...

  • 第十一章 使用类(3)重载运算符

    (三)重载运算符: 1.作为友元非成员函数还是成员函数 两个操作数的运算符,如果运算符重载是成员函数版本,那么第...

  • 日记之旅第七天

    上午:重点讲解了函数重载,其中包括运算符重载,函数成员重载。运算符重载结合了昨天所讲的友元函数一起使用 下午:复习...

  • C++ 部分运算符重载

    可重载的运算符 不可重载的运算符和符号 重载运算符为类的成员函数 重载运算符为友元函数 重载赋值运算符 重载流插入...

  • C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式---成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则:不可臆造运算符;运算符...

  • C++ - 运算符重载为友元函数

    通常,将运算符重载为类的成员函数 重载为友元函数的情况:成员函数不能满足使用要求普通函数,又不能访问类的私有成员

  • C++第7天: 第112-第126课 友元,成员函数不在堆区

    友元修饰 1. 成员函数 2. 修饰类 3. 全局函数 运算符重载 1.仿生函数

  • C++运算符重载

    C++运算符重载的实质:运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够...

  • operator-()

    负号重载成员函数友元函数负号重载函数三种方式都可

  • C++派生类的友元函数,派生类的析构函数

    一、赋值兼容 运算符重载函数需要访问父类的私有成员,运算符重载函数是父类的友元函数,子类继承了父类,子类也可以使用...

网友评论

    本文标题:C++运算符重载形式--成员函数or友元函数?

    本文链接:https://www.haomeiwen.com/subject/kowywqtx.html