変数の別名となる参照の理由
参照を、再設定もnull化もできないコンパイル時の別名として学びます。
「変数の別名となる参照の理由」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
参照とは何か
参照とは、別の変数に対するコンパイル時の別名です。ポインターでもコピーでもなく、別の名前で同じオブジェクトを指すものです。
参照の構文
型の後ろに&を付けます。参照は宣言時に初期化する必要があり、後から別の対象に付け替えることはできません。
int x = 10;
int& ref = x; // ref is an alias for x
ref = 20; // x is now 20ポインターとの比較
参照とポインターはどちらも間接的にオブジェクトを扱いますが、次の違いがあります。
- 参照は初期化が必須ですが、ポインターはnullにできます
- 参照は別のオブジェクトに再代入できません
- 参照では
*や->を使わず、通常の変数のように扱います
付け替えはできない
いったん束縛されると、参照は常に同じオブジェクトを指します。参照に代入すると、参照自体ではなく参照先の値が変更されます。
int a = 1, b = 2;
int& r = a;
r = b; // a becomes 2, r still refers to a参照は同じアドレスを持つ
参照は元の変数そのもののように動作します。参照のアドレスを取得すると、参照先のアドレスが得られます。
int x = 42;
int& r = x;
std::cout << (&r == &x); // 1 (true)const参照
const参照は読み取り専用の別名です。大きなオブジェクトをコピーせずに渡す場合に便利です。
void print(const std::string& s) {
std::cout << s; // can read, not modify
}一時オブジェクトへのconst参照の束縛
const参照に束縛された一時オブジェクトは、参照自体の寿命まで存続します。式の中で便利な機能です。
const std::string& greeting = std::string("Hi");
std::cout << greeting; // valid戻り値の型としての参照
関数は参照を返すことができます。連鎖呼び出しや、メンバーへの直接アクセスに便利です。ただし、ローカル変数への参照を返さないよう注意してください。
int& at(std::vector<int>& v, size_t i) {
return v[i];
}
at(v, 0) = 99; // modifies v[0]ローカル変数への参照は決して返さない
ローカル変数は関数が戻ると破棄され、参照はダングリング参照になります。これは未定義動作です。
// BUG
int& bad() {
int x = 10;
return x; // x dies here
}範囲ベースforでの参照
範囲ベースforでは、参照が暗黙的に使用されます。auto&は参照を取得し、autoはコピーを取得します。
構造化束縛での参照
C++17の構造化束縛では、値、参照、const参照のいずれでも束縛できます。
std::pair<int, int> p = {1, 2};
auto [a, b] = p; // copies
auto& [x, y] = p; // references — modifying x changes p.first確認問題
なぜ参照は、後から別の変数へ付け替えられないのですか。
まとめ
参照は、初期化が必須で付け替えのできないコンパイル時の別名です。通常の変数のように見え、nullになることも再代入されることもありません。読み取り専用のビューにはconst参照を使用してください。
よくある質問
「変数の別名となる参照の理由」レッスンは無料ですか?
はい。「変数の別名となる参照の理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「変数の別名となる参照の理由」で何を学びますか?
参照を、再設定もnull化もできないコンパイル時の別名として学びます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「変数の別名となる参照の理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 変数の別名となる参照の理由
- 値渡しと参照渡しの比較
- const参照とその使いどころ
- 参照の寿命とダングリング参照