次のように定義されたクラスメンバーがあります。
someType* X;
そして私はそれを次のように取得します:
someType* getX() {return x;}
ポインタではなく値を取得したい:
someType getX() {return x;} //this is wrong
これの適切な構文は何ですか? ポインターではなく値を取得するにはどうすればよいですか?
someType getX() {return *x;}
ただし、これはx
値によって返されるx
ことに注意してください。つまり、各 return*のコピーを作成します。そのため (実際の内容によっては)代わりに参照someType
を返すことを好む場合があります。
someType& getX() {return *x;}
参照による戻りは、構築コストが高く、オブジェクトの暗黙的なコピーが微妙なバグを引き起こす可能性がある非プリミティブ型に推奨されます。
* @ paul23が以下で正しく指摘しているように、これは戻り値の最適化によって場合によっては最適化される可能性があります。ただし、安全な動作は、一般的にこれを当てにしないことです。余分なコピーを作成したくない場合は、参照 (またはポインター) を返すことにより、コンパイラーと人間の読者の両方のコードで明確にします。
someType getX() const { return *x; }
または、コピーするのにコストがかかる場合は、参照someType
によって返します。const
someType const &getX() const { return *x; }
const
メソッドの修飾子に注意してください。
SomeType getX()
{
// SomeType x = *x; // provided there is a copy-constructor if
// user-defined type.
// The above code had the typo. Meant to be.
SomeType y = *x;
return y;
}