C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の値渡しと参照渡しの違いを徹底解説!使い分けのポイントも紹介

C++では、関数へ引数を渡す方法が複数用意されています。主な方法は以下の3つです。

  • 値渡し(Call by Value)
  • 参照渡し(Call by Reference)
  • アドレス渡し(Call by Address)

アドレス渡しは「参照渡し」と呼ばれることもありますが、C++において両者は別の仕組みです。アドレス渡しではポインタ変数を使って、メモリ上の正確なアドレスそのものを渡します。一方、参照渡しでは参照変数(元の変数の別名=エイリアス)を渡します。なお、C言語には参照という機能が存在しないため、同じ効果を得るにはポインタを渡す必要があります。

この記事では、値渡しと参照渡しの動作の違いをサンプルコードと実行結果とともに解説し、どのような場面で参照渡しを使うべきかについても紹介します。

値渡し(Call by Value)とは

値渡しでは、引数として渡された実引数の値は、関数内で操作を行っても元の値は変化しません。値渡しを行うと、メモリのスタック領域にその変数のコピーが作成されます。関数内で値を変更しても、変更されるのはあくまでコピーされた値であり、呼び出し元の実際の変数の値はそのまま保たれます。

サンプルコード

#include<iostream>
using namespace std;

void my_function(int x) {
    x = 50;
    cout << "Value of x from my_function: " << x << endl;
}

int main() {
    int x = 10;
    my_function(x);
    cout << "Value of x from main function: " << x;
}

実行結果

Value of x from my_function: 50
Value of x from main function: 10

このように、関数内では x が50に変更されていますが、main 関数側の x は10のままです。これは、関数に渡されたのが元の変数のコピーだったためです。

参照渡し(Call by Reference)とは

参照渡しでは、引数として渡した実引数の値が、関数内での操作によって変更されます。参照渡しを行うと、スタック領域にその変数への参照のコピーが作成され、関数内ではこの参照を通じて元の変数にアクセスします。そのため、参照経由で値を変更すると、実際の変数の値そのものが書き換わります。

サンプルコード

#include<iostream>
using namespace std;

void my_function(int &x) {
    x = 50;
    cout << "Value of x from my_function: " << x << endl;
}

int main() {
    int x = 10;
    my_function(x);
    cout << "Value of x from main function: " << x;
}

実行結果

Value of x from my_function: 50
Value of x from main function: 50

仮引数を int &x と宣言するだけで、x は呼び出し元の変数の別名になります。そのため、関数内での変更が main 関数側にも反映されています。

参照渡しを使うべき場面

  • 呼び出し元の変数を変更したい場合:渡した引数の値を、呼び出された側の関数で書き換えたいときに参照渡しが主に使われます。
  • 複数の戻り値が必要な場合:1つの関数が返せる戻り値は基本的に1つだけです。複数の結果を受け取りたい場合は、出力用の引数として参照渡しを利用することで実現できます。

補足:大きなデータを扱う場合はconst参照が便利

大きな構造体やクラスのオブジェクトを値渡しすると、コピーのコストが大きくなりパフォーマンスに影響します。関数内で値を変更しないのであれば、「const参照」を使うことで、コピーを避けつつ元の値を意図しない変更から守ることができます。

void print_value(const int &x) {
    cout << x << endl; // 読み取りのみ可能。x = 50; はコンパイルエラー
}

このように、用途に応じて値渡し・参照渡し・const参照を使い分けることが、安全で効率的なC++プログラミングのポイントです。

  1. C++とC#の違いとは?メモリ管理・実行速度・継承などを徹底比較

    C++とはC++は、静的型付けのコンパイル型言語であり、大文字と小文字を区別する自由形式の汎用プログラミング言語です。手続き型・オブジェクト指向・ジェネリックといった複数のプログラミングパラダイムをサポートしており、OSやゲームエンジン、組み込みシステムなど幅広い分野で活用されています。C++は、高水準言語の生産性と低水準言語ならではのハードウェア制御能力を兼ね備えていることから、「中級言語(ミドルレベル言語)」と位置づけられることもあります。C#とはC#は、マイクロソフトがアンダース・ヘルスバーグ(Anders Hejlsberg)の主導のもと、.NET構想の一環として開発した、シンプルでモ

  2. C#の値渡しと参照渡し(refパラメーター)の違いを徹底解説

    C#では、メソッドに引数を渡す方法として「値渡し」と「参照渡し」の2種類があります。それぞれの仕組みの違いを理解することは、バグの防止や効率的なコード設計において非常に重要です。本記事では、両者の違いをわかりやすく解説します。 参照パラメーター(参照渡し)とは 参照パラメーターとは、変数が格納されているメモリ上の位置(アドレス)への参照を表すものです。参照パラメーターは、メソッドに渡された実引数と同じメモリ位置を共有します。 そのため、パラメーターを参照渡しにした場合、値渡しとは異なり、新しいストレージ領域は作成されません。メソッド内でパラメーターに行われた変更は、呼び出し元の変数に直接反映さ