0

演算子のオーバーロード中に常に独自のコピーコンストラクタを作成するのは安全ですか?

Complex Complex::operator+(const Complex&  other)
{
    Complex local ;
    local.result_real = real + other.real;
    local.result_imaginary = imag + other.imag;
    return local ;
}

ほとんどの場合、参照として返すのではなく、上記の形式を見てきました。

1のようなサムルールを取ることができますか-常に参照によって関数パラメータを渡します。2-常に参照によってオブジェクトを返します。

オブジェクトを値のみで返す必要がある演算子のオーバーロードの特別なケースはありますか?

4

2 に答える 2

1

1のようなサムルールを取ることができますか-常に参照によって関数パラメータを渡します。2-常に参照によってオブジェクトを返します。

いいえ、そうではありません。ぶら下がっていない参照を返す方法を見つけたとしても、加算などの操作は意味をなさないため、参照を返さないはずです。a+b新しいオブジェクトを返す必要がa+=bありますが、LHSへの参照を返すことは理にかなっています。

参照による引数の受け渡しに関しても、経験則はありません。このことを考慮:

A operator+(const A& lhs, const A& rhs)
{
  A tmp = lhs; // explicitly make a copy
  return tmp += rhs;
}

この:

A operator+(A lhs, const A& rhs)
{
  return lhs += rhs;
}

2番目のバージョンは、1つの引数を値で渡すため、コードが単純になり、コンパイラーが一時的なコピーを削除する機会が増えます。

于 2012-11-30T07:04:36.980 に答える
0

一部の演算子では参照を返す必要があり、他の演算子では返さない必要があり、さらに他の演算子は完全に他の型を返します(比較演算子など)。

あなたの場合、あなたはすべきではありません。特に、関数が戻ったときに無効になるローカル変数への参照を返すためです。

于 2012-11-30T07:01:13.690 に答える