0

ゲッター/セッターを実装する必要があると仮定します (また、設計が悪いことを示すことが多いため、可能な限り避けるようにしています)。次の 2 つのバリアントはどちらが優れていますか?また、それぞれの意味は何ですか?

可能性 (1):

class Foo;
class Bar
{
public:
    const Foo& getFoo() const {return foo_;}
private:
    Foo foo_;
};

または (2):

class Foo;
class Bar
{
public:
    void getFoo(Foo& foo) const {foo = foo_}
private:
    Foo foo_;
};

個人的には、より直感的なので、常に最初のバリアントを使用します。2 番目のバリアントでは、getFoo を呼び出す前に getFoo の結果を保持する Foo オブジェクトを作成し、getFoo にこのオブジェクトへの参照を渡す必要があります。このバリアントは直感に反するように感じますが、2 番目のバリアントを好む人もいます。2 番目のバリアントが最初のバリアントよりも優れている理由は何ですか?

4

3 に答える 3

7

出力引数は、刑事犯罪と見なす必要があります。使用するのはより困難ですが、コードに表示されないため、特に保守がはるかに困難です。何かが割り当てられている場合、それは明らかです。メソッドがオブジェクトで呼び出された場合、それが変更される可能性があります。ただし、関数に渡されるだけの場合、通常のメンテナンスプログラマーは、関数が変更されているとは思わないでしょう。さらに、ほとんどの場合、値を受け入れるために一時変数を宣言するために追加の行が必要です。

この種のことは、主にC89に立ち寄り、どういうわけかC++構文を学んだ人々によって書かれています。しかし、C++のコピーの省略とC++ 11の移動セマンティクスでは、コードを読みにくくする価値のある正当な理由はわかりません。

もちろん、メンバーを返す場合は、そのメンバーへのconst参照を返すことができます。値が計算される場合は、値で返すだけで、ほとんどの場合、コピーの省略で処理されます。

于 2012-10-25T13:00:38.993 に答える
0

もちろん、一般的な場合は最初のバリアントが望ましいです。戻り値の最適化(RVO)により、返されたオブジェクトはコピーされず、パフォーマンスのオーバーヘッドがないため、2番目よりも効果が低くなりません。

渡されたオブジェクトに事前設定を行う必要がある場合、または部分的なコピーを使用する必要がある場合は、2番目のバリアントが適しています。しかし、もちろん、これはもはや些細なゲッターではありませんが、異なるセマンティクスを持ついくつかの異なる関数です。

2番目のバリアントを使用するもう1つの考えられる理由-渡されたオブジェクトを保持クラスで直接作成できなかった場合。たとえば、その作成が一部のファクトリによってカプセル化されており、クラスをこのファクトリに依存させたくない場合。

于 2012-10-25T12:54:37.490 に答える
0
const Foo& getFoo() const {return foo_;}
于 2012-10-25T13:00:08.553 に答える