c++ - 为什么将 operator< 作为成员函数重载是不好的做法?

标签 c++ algorithm class sorting comparison

<分区>

Possible Duplicate:
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);

但我终生无法弄清楚原因,也找不到任何关于差异的文档。谁能指出我正确的方向?

最佳答案

首先,将运算符实现为成员函数没有任何优势,而将其实现为自由函数会有优势。特别是,成员函数关于两个操作数的类型不是对称的,左侧 (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 ,您可能会在那里找到一些建议。

关于c++ - 为什么将 operator< 作为成员函数重载是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308936/

相关文章:

c# - 如何让方法调用同一个类中的另一个方法?

c++ - 如何将分配给 *Child[n] 的 *Base 指向 Child 数组的下一个元素?

c++ - 如何确定进程打开文件的顺序?

arrays - 如何从 K 个对象中随机挑选少于 N 个对象?

c# - 回溯搜索算法

c++ - 简单多态转换不起作用

c++ - 定义 NDEBUG 时删除断言是否在内联函数之前发生?

c++ - 如何使用字符串参数而不是字符数组来使用 strtok()?

c# - 同时排序 (C#)?

c# - 无法存储类数组