Menu
Coddy logo textTech

参照渡し

CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 41/56。

関数に引数を渡す際、C++は通常、値のコピーを作成します。これは、関数内での変更が元の変数に影響を与えないことを意味します。参照渡し(Pass by reference)は、関数が元の変数を直接操作できるようにすることで、この動作を変更します。

参照渡しにするには、関数宣言のパラメータ型の後に & 記号を追加します:

void doubleValue(int& number) {
    number = number * 2;  // 元の変数を変更します
}

この関数を呼び出すと、関数内で行われたパラメータへの変更は、渡された元の変数を直接変更します。これは、関数に引数を変更させたい場合や、コピーが非効率になるような大きなオブジェクトを扱う場合に特に便利です。

参照渡しはデータのコピーによるオーバーヘッドを排除するため、特にvectorやmapのような複雑なデータ構造を扱う場合に、プログラムをより高速でメモリ効率の良いものにします。

challenge icon

チャレンジ

簡単

関数パラメータを通じて変数を直接変更することで、参照渡しを実証する関数を作成してください。このチャレンジでは、& 記号によって関数がコピーではなく元の変数を操作できるようになる仕組みについての理解をテストします。

以下の入力が提供されます:

  • 最初の数値を表す整数 value1
  • 2番目の数値を表す整数 value2
  • 3番目の数値を表す整数 value3

プログラムは以下の手順を実行する必要があります:

  1. 3つの整数パラメータを参照で受け取る tripleValues という名前の関数を作成します
  2. 関数内で、各パラメータに3を掛けます
  3. メイン関数で、3つの入力値を読み取り、変数に格納します
  4. 関数を呼び出す前に、元の値を出力します
  5. 3つの変数を引数として tripleValues 関数を呼び出します
  6. 関数呼び出しの後に、変更された値を出力して、それらが変更されたことを示します

以下の正確な出力形式を使用してください:

関数呼び出し前:

Original values: [value1] [value2] [value3]

関数呼び出し後:

Tripled values: [new_value1] [new_value2] [new_value3]

関数のシグネチャは、各パラメータ型の後に & 記号を使用して参照渡しを示す必要があります:void tripleValues(int& a, int& b, int& c)。これにより、関数は渡された元の変数を直接変更できるようになり、値渡しと参照渡しの重要な違いが示されます。メイン関数の変数は関数呼び出し後に永続的に変更され、関数がコピーではなく元のメモリ位置を操作したことが証明されます。

チートシート

C++で参照渡しを行うには、関数宣言のパラメータ型の後に & 記号を追加します:

void doubleValue(int& number) {
    number = number * 2;  // 元の変数を変更します
}

参照渡しを使用すると、関数はコピーではなく元の変数を直接操作できるようになります。関数内のパラメータに加えられた変更は、渡された元の変数を修正します。

これにより、データのコピーによるオーバーヘッドがなくなり、特に vector や map のような複雑なデータ構造において、プログラムがより高速でメモリ効率が良くなります。

自分で試してみよう

#include <iostream>
using namespace std;

// TODO: ここで tripleValues 関数を作成します

int main() {
    // 入力値を読み取ります
    int value1, value2, value3;
    cin >> value1 >> value2 >> value3;
    
    // 元の値を表示します
    cout << "Original values: " << value1 << " " << value2 << " " << value3 << endl;
    
    // TODO: ここで tripleValues 関数を呼び出します
    
    // 変更後の値を表示します
    cout << "Tripled values: " << value1 << " " << value2 << " " << value3 << endl;
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン