参照 解答ページ | Programming Place Plus C++編【言語解説】 第16章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも 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;
    Data& r3 = 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;

    n++;
    return 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


参考リンク


更新履歴

’2018/9/14 練習問題①を第17章へ移動。

’2014/7/12 新規作成。



第16章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る