C++メモ for each文で値を変更できるように値を参照渡し(リファレンス)にしてみる

前に便利になったなぁと自己満足していたfor eachに相当する構文を使ったら…値が変更できてないってことになった。
そりゃそうだという内容。

ポイントはこれ。

  • forでリストから受け取る変数の型をリファレンスにする

んで、コードはこんなん。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// テスト用のデータを用意する
vector<string> objValues;
objValues.push_back("aaa");
objValues.push_back("bbb");
// 値渡し(参照渡しでない)の場合
cout << "*** before ***" << endl;
for( string strValue : objValues )
{
strValue += "ccc";
}
for( string strValue : objValues )
{
cout << strValue << endl;
}
// 参照渡しの場合
cout << "*** after ***" << endl;
for( string& strValue : objValues )
{
strValue += "ccc";
}
for( string strValue : objValues )
{
cout << strValue << endl;
}
// テスト用のデータを用意する vector<string> objValues; objValues.push_back("aaa"); objValues.push_back("bbb"); // 値渡し(参照渡しでない)の場合 cout << "*** before ***" << endl; for( string strValue : objValues ) { strValue += "ccc"; } for( string strValue : objValues ) { cout << strValue << endl; } // 参照渡しの場合 cout << "*** after ***" << endl; for( string& strValue : objValues ) { strValue += "ccc"; } for( string strValue : objValues ) { cout << strValue << endl; }
// テスト用のデータを用意する
vector<string> objValues;
objValues.push_back("aaa");
objValues.push_back("bbb");

// 値渡し(参照渡しでない)の場合
cout << "*** before ***" << endl;
for( string strValue : objValues )
{
	strValue += "ccc";
}
for( string strValue : objValues )
{
	cout << strValue << endl;
}

// 参照渡しの場合
cout << "*** after ***" << endl;
for( string& strValue : objValues )
{
	strValue += "ccc";
}
for( string strValue : objValues )
{
	cout << strValue << endl;
}

実行するとこんなん。
“before”の方は値渡しなんでfor文の処理が終わったあとは元の値のまま(つまり、for文の中でしか変更が有効でない)。
で、”after”の方は参照渡しなんで、for文が終わった後でも文字列が変更されたまま(つまり、for文の外でも変更が有効)になる。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
*** before ***
aaa
bbb
*** after ***
aaaccc
bbbccc
*** before *** aaa bbb *** after *** aaaccc bbbccc
*** before ***
aaa
bbb
*** after ***
aaaccc
bbbccc

んまま、メモってことで。