为什么重载运算符<作为会员功能?

时间:2012-04-25 03:26:12

标签: c++ algorithm class sorting comparison

  

可能重复:
  Operator overloading
  Operator overloading : member function vs. non-member function?

经过多年显然滥用这种结构,有人向我指出这是不好的做法:

class SomeClass
{
    ...
    bool operator<(const SomeClass& other) const;
};

这是一种很好的做法:

class SomeClass
{
    ...
};
bool operator<(const SomeClass& a, const SomeClass& b);

但我不能为我的生活找出原因,也找不到任何关于差异的文档。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

首先,将运算符实现为成员函数没有任何优势,并且将其作为自由函数进行操作可能是有利的。特别是,成员函数关于两个操作数的类型不对称,左侧(lhs)必须是被调用它的类的确切类型,而右侧 - side(rhs)可以使用隐式转换。在自由函数运算符的情况下,相同的转换可以应用于lhs和rhs。

struct SomeClass {
    SomeClass( int value );
    bool operator<( SomeClass const & ) const;
};
bool operator>( SomeClass const &, SomeClass const & );
int main() {
   SomeClass x( 10 );
   x < 100;             // Fine, lhs is SomeClass
   // 100 < x;          // Error, no operator< can take int as lhs and SomeClass
   x > 100;             // Fine
   100 > x;             // Also fine, lhs can take the same implicit conversions
}

请注意,这里的主要区别是隐式转换,只有在您的类型可以从其他类型隐式转换时才会产生差异。如果您的类型没有隐式转换,那么这一点就没有实际意义,但考虑到使用自由函数没有任何缺点,并且在某些情况下有优势,我会尽可能使用自由函数。

我前段时间写过关于运算符重载here的文章,你可能会在那里找到一些建议。