0Pricing
C++ Academy · レッスン

const参照とその使いどころ

const参照を使って、大きなオブジェクトを効率的かつ安全に渡します。

「const参照とその使いどころ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

const参照が保証すること

const T&は「参照先を変更しません」という意味です。コンパイラーがこれを保証します。

void print(const std::string& s) {
    // s.clear();   // ERROR: s is const
    std::cout << s;
}

なぜ値渡しだけにしないのか

大きなオブジェクトをコピーするのは無駄です。const参照のコストは実質的にゼロ(内部的には単なるポインター)であり、関数が呼び出し元のデータを変更することもありません。

あらゆるものに束縛できる

const参照は左辺値、右辺値、一時オブジェクトのいずれにも束縛できます。そのため、読み取り専用アクセス用のパラメーター型として最も柔軟です。

void f(const std::string& s);
std::string a = "hi";
f(a);                 // lvalue
f("hello");           // temporary string
f(std::move(a));      // rvalue

寿命の延長

一時オブジェクトをconst参照に束縛すると、その一時オブジェクトの寿命が参照の寿命まで延長されます。インラインでのオブジェクト構築に便利です。

const std::string& greeting = "Hello, " + name;
// the concatenated string lives as long as `greeting`

const参照を使わない場合

簡単にコピーできる型(int、double、ポインター)では、値渡しを使用してください。参照を使うと、何も節約できないまま間接参照が1つ増えます。

範囲ベースforでのconst参照

読み取り専用ループの定番です。コピーと、意図しない変更の両方を避けられます。

for (const auto& x : container) {
    process(x);
}

const参照を返す

結果が既存のオブジェクトで、呼び出し元から変更させたくない場合(メンバーやキャッシュされた値など)は、const参照を返します。

class Person {
    std::string name_;
public:
    const std::string& name() const { return name_; }
};

const正確性

状態を変更しないすべてのパラメーターとメンバー関数にconstを付けてください。コンパイラーが意図しない書き込みを検出してくれるため、強力な安全策になります。

constメンバー関数

パラメーターリストの後ろにconstを付けたメンバー関数は、オブジェクトを変更できません。constインスタンスに対して呼び出せます。

class Counter {
    int n_ = 0;
public:
    int value() const { return n_; }   // pure reader
    void increment() { n_++; }
};

落とし穴:const_castでconstを取り除く

const_castを使ってconstを取り除くことはできますが、もともとconstだったオブジェクトに対してこれを行うと未定義動作になります。レガシーな非const APIと連携する場合に限って使用してください。

内部状態にはmutable

mutableキーワードを使うと、constメンバー関数から特定のメンバーを変更できるようになります。キャッシュやミューテックスに便利です。

class Cache {
    mutable std::mutex mtx_;
    mutable std::optional<int> cached_;
public:
    int value() const {
        std::lock_guard<std::mutex> lk(mtx_);
        // ...
    }
};

確認問題

パラメーターには、通常std::stringよりconst std::string&と書くほうがよいのはなぜですか。

まとめ

読み取り専用のパラメーター、getterの戻り値、範囲ベースループにはconst T&を使用してください。複雑な型では値渡しより高速で、非const参照より安全です。

よくある質問

「const参照とその使いどころ」レッスンは無料ですか?

はい。「const参照とその使いどころ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「const参照とその使いどころ」で何を学びますか?

const参照を使って、大きなオブジェクトを効率的かつ安全に渡します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「const参照とその使いどころ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 変数の別名となる参照の理由
  2. 値渡しと参照渡しの比較
  3. const参照とその使いどころ
  4. 参照の寿命とダングリング参照
← C++ Academyに戻る