代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

为什么运算符有时是独立的,有时是类方法?

  •  5
  • Paul Tomblin  · 技术社区  · 15 年前

    为什么有时一个操作符重写被定义为类中的一个方法,比如

    MyClass& MyClass::operatorFoo(MyClass& other) { .... return this; };
    

    有时它是一个独立的功能,比如

    MyClass& operatorFoo(MyClass& first, MyClass& bar)
    

    它们是等价的吗?当你以一种方式做这件事,而当你以另一种方式做这件事时,什么规则支配着你?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Community Navdeep Singh    7 年前

    如果你想做点什么 3 + obj 您必须定义一个自由(非成员)运算符。

    如果你想让你的操作者受到保护或私有化,你必须让他们成为方法。

    有些运算符不能是自由函数,例如, operator-> .

    此处已回答:

    difference between global operator and member operator

        2
  •  5
  •   anon    15 年前

    如果您有一个类似+的二元运算符,通常希望对两个操作数执行类型转换。例如,字符串串联运算符需要能够将其一个或两个操作数从char*转换为字符串。如果是这种情况,那么它就不能是成员函数,因为左边的操作数是*this,并且不会执行转换。

    例如。:

    operator+( a, b );  // conversions performed on a and b
    a->operator+( b );  // conversion can only be performed on b
    
        3
  •  1
  •   Charles Salvia    15 年前

    如果在类之外定义了运算符,则它被视为全局运算符,并且允许在运算符的左侧显示其他类型。

    例如,给定一个类 Foo ,使用全局运算符 + 你可以这样做:

    Foo f;
    Foo f2 = 55 + f;