0

私はC++にかなり慣れておらず、カスタム演算子について学ぼうとしています。私が現在抱えている問題は、私自身の+=演算子とそれを実行するための最良の方法を定義することに関連しています。これには、追加できるpublic intメンバー(intValue)を持つ単純なクラスが含まれます。私が一度に1つずつ試した次の2つのコード例は、私が知る限り、私のプログラムでまったく同じように動作します。「まったく同じ」とは、同じ結果が得られ、同じ数のオブジェクトを作成することを意味します。

どちらがより正しいか(標準的な方法)、そしてその理由は何ですか?

Utility& operator +=(Utility& left, Utility right)
{
    return left = left + right;
}

または

void operator +=(Utility& left, Utility right)
{
    left = left + right;
}

そして、それが重要な場合、彼らが呼ぶ演算子:

Utility operator +(Utility left, Utility right)
{
    return Utility(left.intValue + right.intValue);
}

このクラスは、コンストラクターが呼び出されるたびにメッセージを出力するため、新しいオブジェクトが作成されているかどうかを確認できます。これに基づいて、ここで試している+ =の2つの形式では、同じ数のオブジェクトが作成されます。

4

2 に答える 2

2

+=通常は左側のオペランドを変更するため、通常は(結果を保持するために一時的な値を作成する必要がある)という観点から実装しない方がよいでしょう。operator+

同様に、左側のオペランドでは合理的に変換を行うことができないため、実際にはメンバー関数である必要があります。

Utility &Utility::operator+=(Utility const &right) { 
    intValue += right.intValue;
    return *this;
}
于 2013-02-17T05:59:59.987 に答える
2

+=一般に、左側のオペランドを変更することを期待しますoperator +が、一時的な値を作成する結果となる実装を避けた方がよいでしょう。

その上、

Utility& operator +=(Utility& left, Utility right)
{
    return left = left + right;
}

結果を返すという意味で、他よりも優れています。これにより、ユーザーは次のような複合式を記述できます。

Utility utility1 , utility2;
Utility ut += (utility1 += utility2);

Utilityただし、を使用せずに内部的に変更できる場合は、operator+より適切です。

于 2013-02-17T06:07:05.420 に答える