2017-07-09 3 views
-10

参照を使用せずに書き込むと、なぜ動作しません。文字列内の文字を取得するときに参照を使用する理由は何ですか?

string s("Hello World!!!"); 
    // convert s to uppercase 
    for (auto &c : s) // for every char in s (note: c is a reference) 
     c = toupper(c); // c is a reference, so the assignment changes the char in s 
    cout << s << endl; 
+2

'char c = s [0]; c = toupper(c); 'ここで' c'は最初に文字列の最初の文字のコピーを保持します。次に、他の値を保持するために再割り当てされます。元の文字列は変更されません。一方、 'char&c = s [0];'と書くと、 'c'は文字列の最初の文字への参照(エイリアス)です。 'c 'への代入は' s [0] 'への代入と同じです。あなたのループでも同じことが起こります。 –

+1

[C++ 11の範囲ベースのループの可能な複製:値または参照への参照でアイテムを取得](https://stackoverflow.com/questions/15176104/c11-range-based-loop-get-item-by-value -or-reference-to-const) –

+0

C++でのより良い方法:[std :: transform](http://en.cppreference.com/w/cpp/algorithm/transform)(この例にはトーパが含まれています) –

答えて

0

なぜ私たちは、文字列中の文字を取得したいときに我々が参照を使うのか?

への参照を取得する必要はありません。一般的な文字列内の文字を取得します。 に文字列の文字を変更するには、その文字オブジェクトを参照する必要があります。

リファレンスを使用せずに書き込むと、なぜ動作しません。

「動作しない」とは、文字列sが変更されていないことを意味します。もし、cが参照でなければ、それは文字列sの文字を参照しないので、その非参照オブジェクトを変更しても文字列sには影響しません。

関連する問題