私はそれを理解していると思いますが、この関数は変数m_Labelへの参照を返します。私のプログラム全体でこれを使うことの意義は何でしょうか?参照の代わりに値を返す方が良いでしょうか?ありがとうございました!
答えて
プライベートメンバーへの参照を返します。
これが望ましい多くのケースがありますが、いくつか注意する必要があります。
IMO全体的なパフォーマンスの理由から、整数型ではない内部オブジェクトのコピーを返すことは、一般的にはお勧めできません。はい、私は時期尚早な最適化は良くありませんが、これは実際には最適化ではないことです。呼び出し側がパフォーマンスの影響を判断できるようにするのは良いパフォーマンスの方法です。コピーが必要な場合は、それを参照として割り当てる変数を宣言することはできません。
私はここで使う親指の2つの一般的なルールがあります。
1)あなたは、呼び出し元がconst参照として戻り値を宣言し、直接プライベートオブジェクトを変更することができるようにしたくない場合は、次の
はinline const string& GetLabel() const{ return m_Label; }
2)呼び出し側は、クラスメソッドから返された参照を決して格納しないでください。親オブジェクトがスコープ内にあることが保証されている場合にのみ、ローカルで使用する必要があります。
何らかの理由で内部オブジェクトへの参照を格納するために呼び出し元が必要な場合は、代わりにスマートポインタを使用します。
戻り値の型と同じくらい、アンパサンドは関数名の前にはありません。 string
への参照が返されます。
これは、この関数の呼び出し元が参照によってm_label
の値を変更できることを示しています。一方、文字列をコピーすることはありません。両方の世界のベスト
inline const string& GetLabel() const
{
return m_Label;
}
:あなたはそうのように、const
となる基準や機能をお勧めします。あなたはコピーを避けますが、発信者はあなたのオブジェクトを変更することはできません。
あなたは正しいです。これは文字列メンバへの参照です。
呼び出し元が値を割り当てたり、返された文字列を変更したりすると、メンバー変数も変更されることになります。これが目的でない場合は、カプセル化を破らないように値でコピーを返すことができます。
参照を返すと、呼び出したコードは、返された後にメンバー変数の値を変更できることを意味します。それが起こることを意図しない限り、それは非常に危険です。
const
の方がいいですか、価値によって返されます(&
を除く)。
一つの含意は、囲んでいるオブジェクトが破壊された場合、参照が無効になることである。
Object* o = new Object;
string& label = o->GetLabel();
delete o;
// label becomes a dangling reference here.
別の含意は、発信者が文字列を変更できることです。 const参照を返すことでそれを修正できます。
- 1. THREE.Camera.prototype.lookAt</ <() -</ <はどういう意味ですか?
- 2. クラス<<自分はどういう意味ですか?
- 3. Java "<<"はどういう意味ですか?
- 4. 演算子<<オーバーロードはどのように機能しますか?</p> <pre><code>struct employee { string name; string ID; string phone; string department; }; </code></pre> <p>次の関数はどのように機能するの:
- 5. <変数、変数>とはどういう意味ですか?
- 6. &と&&、|の違いは何ですか? || R?</p> <pre><code>&, && |, || </code></pre> <p>用法の違いを何:
- 7. C++ではテンプレート<>はどういう意味ですか?
- 8. << Rubyの意味
- 9. List <Hashtable <String、List <String>>をIntentにブロードキャストするにはどうすればいいですか?
- 10. >>の意味、<<、| JavaScriptで&nbsp;
- 11. "<<<"演算子の名前は何ですか?
- 12. operator <<のネームスペースのプライベートクラスへのアクセス
- 13. ウェブテキストは<code>&</code>ない<code>&</code>などとして印刷<em>アンパサンド</em>文字で、私はJavaScriptの、例えば<code>name = "John&martin"</code>ではなく、それは<code>John&martin</code>のように見える私のインターフェイスに表示中の名前のリストを持っている& amp;
- 14. << or > >>とはJavaの意味ですか?
- 15. どのように私はセットアップルールは、URLで<strong><code>&</code></strong>で<strong><code>&</code></strong>を交換することができ、URL
- 16. どのような変数がxslで大きいか確認するには?に事業者、および<(& LT);</p> <pre><code><xsl:if test="$a > $b"> </code></pre> <p>は>(& GT)の文字エンティティを使用してみてください:
- 17. ANTLR:関数名と私は私の文法で<em>パラメータ</em>(値<em>ヌル</em>)と<em>関数名</em>両方として「NULL」を使用できるようにしたいと思いパラメータ
- 18. JavaScriptでタグ<< =の意味は何ですか?
- 19. グローバルな静的変数と関数の静的変数</p> <pre><code>static Foo foo; // ... foo.func(); </code></pre> <p>そして:優れている</p> <pre><code>Foo& GetFoo(void) { static Foo foo; return foo; } // ... GetFoo().func(); </code></pre> <p>
- 20. <xsd:include schemaLocation = "some.xsd" />とはどういう意味ですか
- 21. <init>と(ネイティブメソッド)はどういう意味ですか?
- 22. "<>"とはどういう意味ですか?
- 23. は、どのように私は戻ってきたものを疑問に思って</p> <pre><code>ostream& operator<< (ostream& os, const unsigned char* s); </code></pre> <p>のような関数宣言の関数のostream&演算子<<(ostreamに&OS、のconst unsigned char型の* s)を
- 24. は、どのように私は2つの整数の引数、<code>i</code>と<code>j</code>を取り、<code>ith</code>と<code>jth</code>完全数の合計を返し<code>henry</code>という名前のメソッドを持つC
- 25. は、どのように私は<code>string</code>あるこの</p> <pre><code>var alldest = cc.returnallfullDestinations(mainElement).Split('|'); </code></pre> <p><code>returnallfullDestionations</code>のようなデータを取得していますC#
- 26. はどのように私はここで</p> <pre><code>data = data & "," & Vbcr & hlnk.Address & ":" & hlnk.TextToDisplay </code></pre> <p>を行う単語から取得した連結hlinks午前文字列の連結
- 27. <E>は、コレクション<E>の意味は何ですか?
- 28. <code>parseTwoPoleBreakers</code>関数に順次<code>df4</code> & <code>df3</code>、<code>df2</code>、文と私は<code>df1</code>に合格しようとしているのPython
- 29. ostream&operator <<(...)のようなクラス名の後に使用する場合のアンパサンドは何ですか?
- 30. この `#((?<= \?)|&)openid \。[^&] +#` regexpはどういう意味ですか?
実際、あなたはおそらくconstと非constバージョンの両方を望んでいます。 – ildjarn
@ildjamそれは部分的にしか真実ではありません。呼び出し元がオブジェクトを直接変更できるようにする必要がある場合を除き、通常はconstバージョンを提供するだけです。非constバージョンを提供する場合は、constバージョンを提供する必要があります。これにより、親オブジェクトへのconst参照がある場合でも読み取り専用アクセスを得ることができます。 – Gerald
@Gerald:申し訳ありませんが、私は明確にする必要があります - あなたがリファレンスを返す非constバージョンを望むなら、あなたはほぼ確実にconstバージョンも望んでいました。 – ildjarn