ポインターと参照の使い分け
任意性と所有権の意味に基づいて、ポインターと参照を使い分けます。
「ポインターと参照の使い分け」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
用途に応じて異なる道具を使う
参照とポインターはどちらも別のオブジェクトへの間接アクセスを可能にしますが、意味は異なります。それぞれの長所が生きる場面で使ってください。
必須の対象には参照を使う
参照はnullにできず、別の対象へ再バインドすることもできません。関数が常に実体のあるオブジェクトを必要とする場合は、参照パラメーターを使ってください。
void render(const Image& img); // must have an imageオプショナルな対象にはポインターを使う
ポインターはnullにできます。引数が本当にオプショナルな場合は、ポインターを使ってください。
void render(const Image* img); // nullptr means "skip"再代入する場合はポインターを使う
ポインターは別のオブジェクトへ向け直せます。移動するカーソルや現在のノードのように、アルゴリズムの途中で間接参照の対象が変わる場合に使ってください。
Node* current = head;
while (current) {
process(current);
current = current->next;
}参照のコンテナーには参照を使う?
std::vector<T&>は作成できません。代わりにstd::vector<std::reference_wrapper<T>>を使うか、ポインターを格納してください。
参照を返す
結果が呼び出しの終了後も存続し、呼び出し元が直接使用できる場合は、参照を返してください(メンバーやコンテナー要素など)。
std::string& Person::name() { return name_; }ポインターを返す
関数が「結果なし」を返す可能性がある場合や、所有権が明確でない場合は、ポインターを返してください。現代のコードでは、std::optionalまたはスマートポインターを優先してください。
クラスメンバー
メンバーとして参照を格納すると、オブジェクトの存続期間中、参照先が固定され、コピー代入も禁止されます。ポインターメンバーはより柔軟ですが、nullチェックが必要です。
ポリモーフィズム
ポリモーフィズムには、ポインターと参照のどちらも使えます。コンテナーには基底クラスのポインターを格納してください(vectorは参照を保持できません)。nullが無効なパラメーターには参照を使ってください。
所有にはスマートポインターを使う
生のポインターは所有権を持たない間接参照にのみ使ってください。所有権はstd::unique_ptrまたはstd::shared_ptrに持たせます。
選択の早見表
簡単な指針:
- 常に有効なオブジェクト → 参照
- 存在しない可能性がある → ポインターまたは
std::optional - 間接参照の対象が移動する → ポインター
- メモリを所有する → スマートポインター
- コンテナーに格納する → ポインター(参照のvectorは扱いにくい)
クイックチェック
nullでないオブジェクトを必須とする関数には、どのパラメーター型が最適ですか?
まとめ
必須で対象が固定されている場合は参照を、オプショナルな対象や移動する対象にはポインターを使ってください。所有権を扱う場合はスマートポインターを優先してください。コンテナーでは通常、参照ではなくポインターが必要です。
よくある質問
「ポインターと参照の使い分け」レッスンは無料ですか?
はい。「ポインターと参照の使い分け」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ポインターと参照の使い分け」で何を学びますか?
任意性と所有権の意味に基づいて、ポインターと参照を使い分けます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ポインターと参照の使い分け」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 生ポインターとアドレス演算子
- デリファレンスとポインター演算
- nullptrとnullポインターの安全性
- ポインターと参照の使い分け