2

このコードが機能する理由を理解しようとしています(特に「価格」の部分)

struct CarType
{
    string maker;
    int year;
    float price;
    bool operator > (carType car)
    {
        if (price > car.price)
            return true;
        else return false;
    }
};

「myCarが左オペランドだったので、myCar.priceは必要ありません」と書かれています。どういう意味ですか?私はこれを別の.hファイルに書きました:

bool operator > (Fraction a, Fraction b)
{
    if (a.numerator*b.denominator > b.numerator*a.denominator) return true;
    else return false;
}

2つの分数構造体をどのように通過したかを確認しますか?「myCar」が1つのCarTypeデータ構造体を渡すだけでよい理由や、説明の意味がわかりません。誰かが私を教えてくれませんか?ありがとう!

4

4 に答える 4

2

operator>(クラスのメンバーではなく)フリー関数として記述する場合は、2つのオペランドが必要です。

メンバー関数として記述した場合でも、2つのオペランドがありますが、そのうちの1つは非表示のthisオペランドです。(非静的メンバー関数を呼び出すときは、クラスの特定のインスタンスで呼び出すことに注意してください。)

私が暗黙のうちに入れたかどうかを理解するのに役立つかもしれませんthis->

bool operator > (carType car)
{
    if (this->price > car.price)
        return true;
    else return false;
}

また、必要に応じて、このような車を比較できることも意味します。

CarType one, two;
if (one.operator>(two)) // same as if (one > two)
{
    // some code...
}
于 2012-09-02T01:58:20.647 に答える
1

3つのポイント:

  1. すべてのデータメンバーをコピーする必要があるため、パラメータを値で渡すにはコストがかかります。
  2. 比較によってオブジェクトが変更されることはないため、constコードに振りかける必要があります。
  3. if (expr) return true; else return false;常に次のように簡略化できますreturn expr;

変更されたコード:

bool operator>(const carType& car) const
{
    return price > car.price;
}

bool operator>(const Fraction& a, const Fraction& b)
{
    return a.numerator*b.denominator > b.numerator*a.denominator;
}
于 2012-09-03T08:39:04.847 に答える
1

CarType構造体です。車に関する情報が含まれています。maker正しく初期化されていると仮定すると、、、yearおよびの値が設定されていますprice

bool operator > (carType car)のメンバー演算子ですCarType。メンバー演算子>が呼び出されると、関数と同じように、左側のオブジェクトから/によって呼び出されます。CarTypeと呼ばれる関数が内部にある場合はmyFunction、次のように呼び出します。

myCar.myFunction();

そして、それはすでに内部に設定されているデータで動作しmyCarますよね?演算子についても同じです。>の演算子を作成するときはCarType、次のように呼び出します。

myCar > otherCar

おそらくそれを取り巻くifか何かがありますが、要点は立っています。myCar>演算子の左側にあるため、左側のオペランドです 。>で呼び出されmyCarotherCar右側の変数として渡されます。演算子は物事をより美しく見せます。この場合、>関数は次のように関数を記述した場合と同じですCarType

bool isGreaterThan (carType car)
{
    if (price > car.price)
        return true;
    else return false;
}

そして、この関数は次のように呼び出されます。

myCar.isGreaterThan(otherCar);

この場合、何が起こっているのかは明らかですよね? myCar関数が呼び出されているオブジェクトです。otherCar比較対象の車です。演算子を使用する場合も同様です。>左側のオペランドが関数を呼び出し、右側のオペランドが渡されることを意味します。演算子のオーバーロードにより、コードがシンプルで読みやすくなり、柔軟性が提供されます(つまり、演算子に基づいて並べ替えを実行するデータ構造がいくつかあります。関数で等式を定義することにした場合、彼らはそれを行うことができませんでしたisGreaterThan

これで混乱が解消されることを願っています。他に説明してほしいことがあれば教えてください!

于 2012-09-02T01:56:25.717 に答える
0

最初operator>はのメンバーでCarTypeあるため、それを呼び出すインスタンスはCarType左側のオペランドです。2番目operator>は何のメンバーでもないため、左側のオペランドを指定する必要があります。

于 2012-09-02T01:54:01.053 に答える