2

私はC++ Primerで読みました:

文字列内の文字の値を変更したい場合は、ループ変数を参照型として定義する必要があります (§ 2.3.1, p. 50)。参照は、特定のオブジェクトの単なる別の名前であることを忘れないでください。参照を制御変数として使用すると、その変数はシーケンス内の各要素に順番にバインドされます。参照を使用して、参照がバインドされている文字を変更できます。

さらに彼らはこのコードを与えます:

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;

このコードの出力は HELLO WORLD!!! です。

私も読んだ:

別のオブジェクトを参照するように参照を再バインドする方法はありません。参照を再バインドする方法がないため、参照を初期化する必要があります。

c質問 : このコードは、参照変数が文字列 s の次の文字にバインドされるたびに再バインドを引き起こしませんか?

for (auto &c : s)   
    c = toupper(c); 
4

3 に答える 3

1

検討

char s[5] = {'h','e','l','l','o'};

for (int secret_index=0; secret_index<5; ++secret_index) {
    char &c = s[secret_index];
    c = toupper(c);
}

繰り返しのたびに、新しい参照 (同じ変数名を持つ) が初期化されます。つまり、 for ループは反復ごとにスコープに出入りします。

于 2013-06-26T13:47:25.080 に答える