13

私はC++FAQを読んでいました。そこで、演算子のオーバーロードの使用に関するガイドラインのポイントを見つけました。

建設的な演算子を提供する場合は、左側のオペランドの昇格を許可する必要があります(少なくとも、クラスに明示的なキーワードでマークされていない単一パラメーターのctorがある場合)。たとえば、クラスFractionがintからFractionへの昇格をサポートしている場合(非明示的なctor Fraction :: Fraction(int)を介して)、2つのFractionオブジェクトに対してx --yを許可する場合は、42--yも許可する必要があります。実際には、これは単に、operator-()がFractionのメンバー関数であってはならないことを意味します。通常、それを一般に公開する以外の理由がない場合は、それを友達にします。クラスの一部ですが、友達でなくても、メンバーであってはなりません。

なぜ作者はoperator-()をメンバー関数にすべきではないと書いたのですか?

メンバー関数としてoperator-()を作成した場合の悪い結果と、その他の結果は何ですか?

4

1 に答える 1

19

これはFraction、演算子をメンバー関数として使用したものです。

class Fraction
{
    Fraction(int){...}

    Fraction operator -( Fraction const& right ) const { ... }
};

これにより、これは有効なコードです。

Fraction x;
Fraction y = x - 42;

およびそれに相当するx.operator-( Fraction(42) ); しかし、これはそうではありません:

Fraction z = 42 - x;

42メンバー関数operator -が含まれていないため(もちろん、クラスでもありません)

ただし、代わりに演算子をフリー関数として宣言すると、変換操作が両方の引数に適用されます。したがって、この

Fraction z = 42 - x;

これに変わります

Fraction z = Fraction(42) - x;

これは。と同等operator-( Fraction(42), x )です。

于 2012-06-09T05:44:15.570 に答える