C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① 次の中から、非const の参照型変数で参照できるものを選んでください。
const が付かない参照で参照できるのは、以下の3つです。
int main()
{
long int n;
int a[10];
struct Data {int a;} data;
long int& r1 = n;
int (&r2)[10] = a;
& r3 = data;
Data}
配列を参照する際には要素数も含める必要があります(本編参照)。
const が付かない参照で参照できないのは、以下の3つです。
「10.0」は右辺値なので参照できません。
NULL は、整数型の定数に置換されるので(第2章)、これも右辺値です。よって、非const な参照では参照できません。
“abc” のような文字列リテラルは左辺値ですが、const が付いているため const参照でなければ参照できません。
これらはいずれも const参照でならば参照できます。
int main()
{
const double& r1 = 10.0;
const char (&r2)[4] = "abc";
void* const& r3 = nullptr;
}
ポインタへの const参照の記述は少々厄介ですが、書き換えられない constポインタ変数を「const int* const p;」と書く要領で考えてください。ここでは、const にしたいのはポインタではなく参照なので、参照の方に const が付くようにしないといけません。
問題② 次のプログラムの実行結果を答えてください。
#include <iostream>
int func()
{
static int n = 0;
++;
nreturn n;
}
int main()
{
const int& cr = func();
std::cout << cr << std::endl;
const int& cr2 = func();
std::cout << cr << std::endl;
std::cout << cr2 << std::endl;
}
func関数の戻り値は、静的ローカル変数 n の「コピー」であることがポイントです。戻り値を const参照で受け取っていますが、参照している相手はコピーなので、その後で n の値が変化しても影響を受けません。よって、実行結果は次のようになります。
実行結果:
1
1
2
練習問題①を第17章へ移動。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |