79

戻り値、値への参照、および値への const 参照の違いを説明してもらえますか?

価値:

Vector2D operator += (const Vector2D& vector)
{
    this->x += vector.x;
    this->y += vector.y;
    return *this;
}

非定数参照:

Vector2D& operator += (const Vector2D& vector)
{
    this->x += vector.x;
    this->y += vector.y;
    return *this;
}

定数参照:

const Vector2D& operator += (const Vector2D& vector)
{
    this->x += vector.x;
    this->y += vector.y;
    return *this;
}

これの利点は何ですか?関数内で参照が指しているこの値を変更しないようにしたいので、関数に渡す const 参照の背後にある意味を理解しています。しかし、const参照を返す意味に混乱しています。値を返すよりも参照を返す方が優れているのはなぜですか? また、const 参照を返す方が非 const 参照を返すよりも優れているのはなぜですか?

4

5 に答える 5

47

みたいな変なことを書かない限り違いはありません

(v1 += v2) = v3;

最初のケースでは、割り当ては一時的に行われ、全体的な効果はv1 += v2.

2 番目のケースでは、割り当てが になるv1ため、全体的な効果は になりますv1 = v3

3 番目のケースでは、割り当ては許可されません。このような奇妙さはほぼ間違いなく間違いであるため、これがおそらく最良の選択肢です。

値を返すよりも参照を返す方が優れているのはなぜですか?

オブジェクトのコピーを作成する必要がないため、効率が向上する可能性があります。

また、const 参照を返すことが、not-const 参照を返すよりも優れているのはなぜですか?

上記の例のような奇妙さを防ぎながら、

v1 = (v2 += v3);

しかし、コメントで指摘されているように、それはあなたの型が組み込み型と同じ形式の (ab)use をサポートしていないことを意味します。

于 2014-02-14T11:26:52.260 に答える
6

関数に引数を渡すのとまったく同じです。

constオブジェクトの外部で変更されたくないオブジェクトのプロパティを返すときに、参照を返したい。たとえば、オブジェクトに名前がある場合、次のメソッドを作成できますconst std::string& get_name(){ return name; };。これが最も最適な方法です。コピー オン リターンなしで、内部プロパティへの「読み取り専用」アクセスを許可します。

演算子をオーバーロードしている場合、変更可能なオブジェクトを返すことが期待されます。そうしないと、通常は機能することが期待される特定の構文でエラーが発生します。奇妙な連鎖を試みるとき、これは非常に重要です。

たとえば、オプション 3 は のようなものでは機能しませんが(v1 += v2).non_const_method()、次のようになります。

v1+=v2;
v1.non_const_method();
于 2014-02-14T11:27:10.840 に答える
1

luk32 が指摘したように、この関数によって返されるオブジェクトへの変更が許可されていないことを確認するだけです。これは基本的に、コンパイル時に論理エラーを見つけるのに役立ちます。オブジェクトを変更しないことが確実であり、コードがオブジェクトを変更していると仮定すると、追跡できます。これは、優れたコーディング プラクティスと考えることができます。

于 2014-02-14T11:32:38.877 に答える