操作员在课外超载

这个问题在这里已经有了答案:

  • 运算符重载的基本规则和习惯用法是什么? 7个答案

  • 基本问题是“您是否希望在操作员的左侧参数上执行转换?” 。 如果是,请使用免费功能。 如果不是,请使用班级成员。

    例如,对于字符串operator+() ,我们希望执行转换,以便我们可以这样说:

    string a = "bar";
    string b = "foo" + a;
    

    执行转换以将char * "foo"转换为std::string 。 所以,我们让字符串的operator+()变成一个自由函数。


    首先:两种不同的方式真的是“作为成员重载”和“作为非成员重载”,后者有两种不同的编写方式(作为朋友内部类定义和外部类定义)。 称他们为“内部课堂”和“课外课堂”会让你感到困惑。


    重载+ =,+, - =, - 等有一个特殊的模式:

    struct Vector2 {
      float x, y;
      Vector2& operator+=(Vector2 const& other) {
        x += other.x;
        y += other.y;
        return *this;
      }
      Vector2& operator-=(Vector2 const& other) {
        x -= other.x;
        y -= other.y;
        return *this;
      }
    };
    Vector2 operator+(Vector2 a, Vector2 const& b) {
      // note 'a' is passed by value and thus copied
      a += b;
      return a;
    }
    Vector2 operator-(Vector2 a, Vector2 const& b) { return a -= b; } // compact
    

    该模式允许在LHS参数的其他答案中提到的转换,同时大大简化了实现。 (无论是成员还是非成员都可以在RHS作为const&或按值传递时进行转换)当然,这只适用于确实要重载+ =和+, - =和 - 等等,但这仍然很常见。


    另外,有时候你想使用Barton-Nackman技巧在类定义中声明你的非成员op +等作为朋友,因为由于模板和重载的怪癖,它可能不会被发现。


    在Meyer的Effective C ++中有一个很好的关于这个问题的讨论:第24项是“当类型转换应用于所有参数时声明非成员函数”,而第46项是“在需要类型转换时定义模板内部的非成员函数”。

    链接地址: http://www.djcxy.com/p/12693.html

    上一篇: Operator overloading outside class

    下一篇: What does it mean to have an undefined reference to a static member?