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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 変数の別名となる参照の理由
- 値渡しと参照渡しの比較
- const参照とその使いどころ
- 参照の寿命とダングリング参照