c ++较少的运算符重载,使用哪种方式?

use*_*451 18 c++ stl operator-overloading

例如:在C++头文件中,如果我定义了一个struct Record,我想用它进行可能的排序,以便我想重载less operator.以下是我在各种代码中注意到的三种方式.我粗略地发现:如果我要放Recordstd::set,map,priority_queue,...容器,第2版的作品(大概3版为好); 如果我要保存Record到a vector<Record> v然后调用make_heap(v.begin(), v.end())等..那么只有版本1工作.

  struct Record
  {
      char c;
      int num;

      //version 1
      bool operator <(const Record& rhs)
      {
         return this->num>rhs.num;
      }

      //version 2
      friend bool operator <(const Record& lhs, const Record& rhs) //friend claim has to be here
      {
         return lhs->num>rhs->num;
      }
  };
Run Code Online (Sandbox Code Playgroud)

在相同的头文件中,例如:

      //version 3
      inline bool operator <(const Record& lhs, const Record& rhs)
      {
         return lhs->num>rhs->num;
      }
Run Code Online (Sandbox Code Playgroud)

基本上,我想在这里提出问题,看看是否有人能够总结出这三种方法之间的差异以及每个版本的正确位置是什么?

Pub*_*bby 6

它们本质上是相同的,除了第一个非const,并允许您自己修改.

我更喜欢第二个原因:

  1. 它不一定是一个friend.
  2. lhs 不必是一个 Record


小智 5

定义less运算符的最佳方法是:

struct Record{
    (...)
    const bool operator < ( const Record &r ) const{
        return ( num < r.num );
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这不允许在左侧进行转换,因此绝对不是*最佳方式*. (3认同)
  • 自然转换的道路是危险的,你不会走路 (3认同)