0

次のコードを見ました。

struct Point
{
    int x,y;
    bool operator <(const Point &p) const {
        return x<p.x||(x==p.x&&y<p.y);
    }
};

私はこれが何であるかを理解していません:

 bool operator <(const Point &p) const {
      return x<p.x||(x==p.x&&y<p.y);
 } 

それは何ですか?

4

4 に答える 4

7

とてもシンプルです。

ポイントを表す構造体を定義しました。そのような構造体が 2 つあると仮定すると、問題のコードはそれらの比較演算子を定義するため、次のようなものを記述できます。

if (pt1 < pt2) { ...

<コンパイラは記号をどのように扱うことができますか? C++ では、次のことを行っています。式pt1 < pt2は として解釈されpt1.operator < (pt2)ます。つまり、 objectという特別な名前のメソッドが呼び出され、引数は に等しくなります。operator <pt1pt2

それが何をしているのか見てみましょう。const Point &p引数の は、比較されるもう一方のオペランドを示します。constオペランドを変更しないことを示し (これにより、コンパイラはより効果的なコードを生成できます)、渡されたものをコピーするのではなく、実際のインスタンス&を操作することを意味します (これも、コピーが行われないため、より高速です)。比較)。structPoint

ここで、式は、左側のオペランドの値 (オブジェクト、つまり、メソッドが実行されているコンテキスト内のオブジェクト)*が右側のオペランドの値と比較されているx<p.xかどうかをチェックします。次に、コードは左辺が右辺と等しい場合をチェックするため、が比較されます。xthisxxy


*言語純粋主義者向け: 言葉遣いは正確ではありませんが、初心者向けの説明では問題ありません。

于 2012-05-30T19:27:56.430 に答える
2

operatorこれは、この特定のケースでは の定義ですoperator <。誰かが行うときに呼び出されるのは次のとおりです。

Point a, b;
if( a < b )
{ 
    //...
}
于 2012-05-30T19:27:01.170 に答える
1

<演算子をオーバーロードするメンバー関数です

Point a,b;
a < b; // the member function is used here.
于 2012-05-30T19:27:23.700 に答える
1

C++ では、構造体はクラスに非常に似ています。そこにあるのは、インスタンス メソッドとしての演算子定義です。const「this」 Point をパラメーター「p」として参照される (変更不可能な) Point と比較しますが、パラメーター リストの後にあるため、「this」 Point を変更することはできません。

于 2012-05-30T19:29:05.027 に答える