値渡しと参照渡しの比較
値渡しと参照渡しの意味上および性能上の違いを比較します。
「値渡しと参照渡しの比較」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
値渡しの復習
引数を値渡しすると、関数はコピーを受け取ります。関数内での変更は呼び出し元に影響しません。
void increment(int x) {
x++; // modifies the copy
}
int n = 5;
increment(n);
std::cout << n; // still 5参照渡し
パラメーターリストで&を使用すると、参照渡しになります。関数は呼び出し元の変数を直接操作します。
void increment(int& x) {
x++;
}
int n = 5;
increment(n);
std::cout << n; // now 6なぜ参照渡しを使うのか
理由は2つあります。
- 大きなオブジェクトのコピーを避ける(性能)
- 呼び出し元の変数を変更する(意味)
const参照:両方の利点
const参照を使うと、コピーを避けながら、関数に変更の権限を与えずに済みます。サイズの大きい入力パラメーターに使用してください。
void printName(const std::string& name) {
std::cout << name;
}経験則
関数パラメーターについては、次のように考えてください。
- コピーコストが小さい(int、double、ポインター) → 値渡し
- コピーコストが大きく読み取り専用 →
const T& - 関数が呼び出し元のデータを変更する →
T&
ポインター渡し
ポインターでも呼び出し元の変数を変更できます。ただし呼び出し元は&で明示的にアドレスを取得する必要があるため、意図が分かりやすくなります。
void increment(int* x) {
(*x)++;
}
int n = 5;
increment(&n);参照パラメーターとポインターパラメーター
値が必ず必要な場合は、参照のほうが扱いやすいでしょう。引数が省略可能な場合はポインターが適しています。nullptrを渡して処理を省略できます。
値を返す
値を返すのがデフォルトです。RVO(Return Value Optimization)とムーブセマンティクスにより、通常は参照を返す場合と同じくらい高速で、しかも安全です。
参照を返す
関数呼び出し後も存続する既存のオブジェクト(たとえばコンテナのメンバー)を返す場合は、参照を返します。ローカル変数への参照は決して返さないでください。
テンプレートで複数の渡し方を組み合わせる
テンプレートでは、値カテゴリーを保持するために、ユニバーサル参照(T&&)とstd::forwardをよく使用します。この内容はムーブセマンティクスのコースで扱います。
よくある間違い:スライシング
派生クラスは、基底クラスのパラメーターに参照(またはポインター)で渡してください。値渡しすると、オブジェクトの派生部分が切り取られます。
class Base { /* virtual */ };
class Derived : public Base { /* members */ };
void takeByValue(Base b); // SLICES Derived!
void takeByRef(Base& b); // OK確認問題
関数が読み取るだけの大きなstd::stringは、どのように渡すべきですか。
まとめ
値渡しはコピーを作り、参照渡しは同じオブジェクトを共有します。読み取り専用の大きなオブジェクトにはconst T&、呼び出し元のデータを変更する場合はT&、小さな組み込み型には値渡しを使用してください。
よくある質問
「値渡しと参照渡しの比較」レッスンは無料ですか?
はい。「値渡しと参照渡しの比較」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「値渡しと参照渡しの比較」で何を学びますか?
値渡しと参照渡しの意味上および性能上の違いを比較します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「値渡しと参照渡しの比較」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 変数の別名となる参照の理由
- 値渡しと参照渡しの比較
- const参照とその使いどころ
- 参照の寿命とダングリング参照