3

Coordというクラスがあります...インスタンスデータx、yがあります。*演算子を使用して、Coordに整数またはdoubleを乗算できるように、*演算子をオーバーライドしたいと思います。これは私が立てた解決策です:

Coord& Coord::operator*(int n)
{
    this->x = this->x*n;
    this->y = this->y*n;
    return *this;
}

それは動作します-私はメインからいくつかのプリントアウトをテストしました...唯一の問題は...-Weffc++フラグから警告を受け取ります!それは私の関数が値で戻るべきだと言っています!この旗が「EffectiveC++」の本に対応していることは知っていますが、手元にコピーがありません。この本は何を示唆していますか?値渡しとはどういう意味ですか?

4

3 に答える 3

6

グリズリーのコメントを詳しく説明するために...これはインプレース乗算ではありません。そのため、次のことを明示的に防ぐためにconstを宣言する必要があります。

Coord Coord::operator*(int n) const {
    Coord c(*this);
    c.x *= n;
    c.y *= n;
    return c;
}

または、便利なコンストラクターがある場合:

Coord Coord::operator*(int n) const {
    return Coord(x*n, y*n);
}

インプレース乗算は異なります(そして非定数):

Coord& Coord::operator*=(int n) {
    x *= n;
    y *= n;
    return *this;
}
于 2012-09-10T23:26:32.120 に答える
1

実装していませんoperator*が、自己変更を実装しoperator*=、結果を元のオブジェクトに割り当てています。

int次の例では、オペレーターの実装の影響を考慮してください。

int x = 5;
int y = 2;
int z = x * y;

これで、コードと同様に整数乗算を実装すると、両方ともy 10 zになります。

通常のoperator*型演算子を実装するには、一時オブジェクトを作成し、それを値で返す必要があります。

あなたはおそらくこのような実装を探しています(クラスに2つのパラメーターコンストラクターがあると仮定します):

Coord Coord::operator*(int n) const
{
    return Coord(x * n, y * n);
}

ただし、多くの場合、演算子の明白な意味のように見えるものはそれほど明確ではなく、オーバーロードは単に混乱を引き起こすことに注意してください。代わりに、次の行に沿って、(名前付きメンバースケーリング関数を使用して)非メンバーの名前付き関数を検討してください。

Coord& Coord::ScaleBy(int n)
{
    this->x = this->x*n;
    this->y = this->y*n;
    return *this;
}

Coord ScaleCoord(Coord c, int n)
{
    return c.ScaleBy(n);
}
于 2012-09-11T02:45:13.090 に答える
1

一般に、この種のことは、メンバーoperator*=と非メンバーの2つの部分で行われoperator*ます*=

Coord& Coord::operator*=(int n) {
    x *= n;
    y *= n;
    return *this;
}

Coord operator*(const Coord& c, int n) {
    Coord res(c);
    res *= n;
    return res;
}
于 2012-09-11T10:13:16.857 に答える