参照または const 参照による戻りには速度の違いはありません。元のオブジェクトへの参照を返すだけであり、コピーは含まれないため、どちらも非常に高速です。
(非定数) 参照によって返されたオブジェクトは、その参照を通じて変更できます。あなたの特定の例でmString
は、公開されているため、とにかく(そして直接)変更できます。ただし、ゲッターとセッターを使用する通常のアプローチ (およびそれらを導入した主な理由) はカプセル化です。ゲッター/セッターを介したデータ メンバーへのアクセスのみを許可するため、設定されている無効な値を検出し、値の変更に応答し、一般に、クラスの実装の詳細をその中に隠しておきます。したがって、ゲッターは通常、const 参照または値によって戻ります。
ただし、const 参照によって戻る場合は、参照をバックアップするためにクラス内にのインスタンスを常に保持するようにバインドされます。std::string
つまり、後でクラスを再設計して、文字列を内部に格納するのではなく、getter でオンザフライで計算するようにしたい場合でも、それはできません。同時にパブリック インターフェイスを変更する必要があり、クラスを使用してコードを壊す可能性があります。たとえば、const-reference によって返される限り、これは完全に有効なコードです。
const std::string *result = &aSample.Get();
もちろん、このコードは、const 参照ではなく値で返すように変更された場合、コンパイルされないダングリング ポインターを生成します。 (訂正してくれた Steve Jessop に感謝)Get()
要約すると、私が取るアプローチはmString
非公開にすることです。Get()
常に文字列が格納されているかどうかに応じて、値または const 参照によって返すことができます。クラスは次のようになります。
class sample
{
std::string mString;
public:
void Set(const std::string &s)
{
mString = s;
}
std::string Get() const
{
return mString;
}
};