3

次のように定義された演算子を持つオブジェクトがあります。

P& operator +(const P &rhs) {
    return P(x + rhs.x, y + rhs.y, z + rhs.z);
}

カスタムのコピー演算子や代入演算子はありません。

ベクトル内で加算の結果を直接割り当てると、その中にゴミが表示されます。

P p1(1.0, 0.0, 0.0);
P p2(0.0, 0.0, 0.0);

vector<P> v(1);
v[0] = p1 + p2; // v[0] now contains garbage.

変数を介してそれを行う場合、すべてが期待どおりです。

vector<P> u(1);
P q = p1 + p2;
u[0] = q; // u[0] contains correct value.

そのような行動の理由は何でしょうか?2つのケースの違いは何ですか?

4

2 に答える 2

10

一時的なものへの参照を返します。関数(この場合は関数)の最後で一時的なものがスコープから外れるため、これは悪い考えoperator+です。オペレーターを次のように宣言します。

P operator +(const P &rhs) const

代わりは。

于 2012-05-02T17:12:05.267 に答える
3

あなたが見るように

P& operator +(const P &rhs) 
{
    return P(x + rhs.x, y + rhs.y, z + rhs.z);
}

関数のスコープ外になると破棄されるローカル変数への参照を返しますoperator +

ヒープに作成されたデータにポインタを戻すことはできますが、呼び出し元がオブジェクトの削除に失敗した場合、メモリリークの十分な範囲が残ります。

オブジェクトをコピーとして返すこともできますが、それは時には実際のオーバーヘッドになる可能性があります

最近のC++11では、move構文を使用して所有権を譲渡します。これは、今後の理想的で好ましいアプローチです。

于 2012-05-02T17:15:08.063 に答える