2017-01-04 34 views
0

C++に触れずに何年も経ってから、私はそれに戻ってテキストブック(Sutherland、Bruce、「ゲーム開発のためのC++の学習」(59ページ) 。Apress。Kindle版。 ")。 は、私は2つの簡単な質問があります。一例では参考値と "const"値の受け渡し

1) を、この本は、関数を呼び出すために次のコード行を使用しています:

string playerInput; 
GetPlayerInput(playerInput); 

と機能自体は次のように定義されます

void GetPlayerInput(string& playerInput) 
{ 
    cin >> playerInput; 
} 

質問: "playerInput"は "string &"として渡されます。本当に必要ですか?なぜ、これは我々だけ関数は文字列を返すようにし、このようにそれを行うことができたときに参照として渡されている:

string playerInput; 
playerInput = GetPlayerInput(); 

そして:

string GetPlayerInput() 
{ 
    cin >> playerInput; 
    return playerInput; 
} 

が、これは単なる文体の選択をするか、私は何かが欠けていますここに?

'void SetName(const std::string& name);' 

なし説明:

2)ユーザ名を取得するには、クラスのアクセサメソッドは次のように定義されました。この "const"のことはどうですか?私は研究をしましたが、もっと混乱しました。文字列をパラメータとして渡すときに、なぜそれが必要なのでしょうか(また参照としても??)

ありがとうございました!

+0

にここで素敵なリストである:あなたが例えばのように、内部でとにかくパラメータをコピーするとき

値でパスを使用することをお勧めします唯一のケースです[C++の書籍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を参照してください。 Scott Meyersの本でよく説明されています。 –

+0

は、値渡しの概念を参照し、参照渡しを行います。値渡しをすると、コピーコンストラクタ(必要に応じて)とconstを不必要に書く必要が生じることがあります。そして1つの提案として、Scott Meyersの本 –

+0

に感謝してください。ブックは次に私の "読む"リストにある:-) –

答えて

1

1)原則として、値を返すにはコピーが必要です。それにもかかわらず、事実上すべてのコンパイラはデバッグモードでもRVO/NRVOを実行します。

一般的にはAPIの選択ですが、ループで使用すると重要になります。たとえば、次の2つを比較してください。

for (;;) { 
    string playerInput = GetPlayerInput(); 
    if (playerInput.empty()) break; 
    // do something with the playerInput 
} 

string playerInput; 
for (;;) { 
    GetPlayerInput(playerInput); 
    if (playerInput.empty()) break; 
    // do something with the playerInput 
} 

微妙な違いがあり、後者の方がはるかに優れています。最初のケースでは、たとえNRVOであっても、文字列は毎回新たに割り当てられます。 2番目のケースでは逆に、文字列は数回だけ割り当てられ/再割り当てされ、最後には最長入力のサイズを持ちます。

また、GetPlayerInputは、ループがより良い探して作ることになる、boolを返すことができます:

string playerInput; 
while (GetPlayerInput(playerInput)) { 
    // do something with the playerInput 
} 

2)のconst参照渡し(非const参照ではなく)だけではなくにそれを不可能にします誤ってパラメータを変更することもありますが、間違いなくもっと重要なのは一時的なを使用することも可能です。例として:

setName("Some name"); 

は非const参照では機能しません。

値を渡すと、コピーがもう一度発生します(コピーに依存するコードが機能しないという欠点があるC++では許可されていますが、保証されていません)一時的なbtwを渡すとき)。

SomeClass operator +(SomeClass a, const SomeClass& b) { 
    return a += b; 
} 

SomeClass operator +(const SomeClass& a, const SomeClass& b) { 
    SomeClass result = a; 
    return result += b; 
} 
+0

#2の重要な部分は、 'const std :: string&'の代わりに 'std :: string'を渡すと、これは最適化のためのものです。 –

+0

それは正しいですが、私は "std :: string&' "vs" 'const std :: string&' "と比較していました。しかし、営業担当者も参照に疑問を呈しているのは事実です。 – axalis

+0

すべての回答/コメントありがとう。私はあまり先んじてこの種の質問をしているかもしれません(私は勉強して実践し続けると自然に答えられるでしょう)が、これは今よりずっと意味をなさない!再度、初心者の質問については申し訳ありませんが、本当に助けに感謝します。 –

0

リファレンスまたは値で渡すかどうかは、プログラマに完全に依存します。参照渡しについては、変数の元の値で変更が行われますが、値渡しを使用すると、実際の引数のコピーが呼び出された関数の仮引数に渡されます。だから、あなたは両方をすることができます!

関連する問題