0Pricing
C++ Academy · レッスン

値渡しと参照渡しの比較

値渡しと参照渡しの意味上および性能上の違いを比較します。

「値渡しと参照渡しの比較」は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フィードバックを取得できます。ローカル設定は不要です。

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

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