C++の値渡しと参照渡しの違いとは?使い分けのポイントを徹底解説
C++では、関数へ引数を渡す方法が複数用意されています。主な渡し方は以下の3つです。
- 値渡し(Call by Value)
- 参照渡し(Call by Reference)
- アドレス渡し(Call by Address)
「アドレス渡し」は「参照渡し」と呼ばれることもありますが、C++においてはこの2つは厳密には異なる概念です。アドレス渡しではポインタ変数を使って変数のメモリアドレスそのものを渡します。一方、参照渡しでは参照変数(元の変数の別名=エイリアス)を渡します。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
この例では、my_function 内で引数 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
今度は my_function の仮引数が int &x となっています。これにより x は呼び出し元の変数の別名として機能するため、関数内での変更がそのまま main 関数側の変数にも反映され、出力も50になっています。
参照渡しを使うべき場面
それでは、参照渡しはどのようなケースで活用すべきなのでしょうか。代表的なユースケースは以下の通りです。
- 呼び出し元の変数の値を変更したい場合
関数内での処理結果を、呼び出し元の変数に反映させたいときは、参照渡しが最適です。値渡しではコピーが変更されるだけで元の変数は更新されないため、意図した動作になりません。 - 複数の戻り値が必要な場合
C++の関数は基本的に1つの戻り値しか返せません。しかし、参照渡しで出力用の引数を渡せば、実質的に複数の結果を呼び出し元へ返すことができます。std::pair や構造体を使う方法もありますが、シンプルなケースでは出力引数として参照を渡す手法がよく使われます。
まとめ
値渡しと参照渡しの違いを整理すると、次のようになります。
- 値渡し:元の変数のコピーを渡すため安全だが、大きなオブジェクトではコピーのコストが発生する。関数外の変数は変更されない。
- 参照渡し:元の変数そのものを操作できるため、値の変更や複数の出力に便利。ただし意図しない変更を防ぎたい場合は const 参照(const T&)を併用するのが一般的。
さらに補足すると、大きなクラスや構造体を引数として渡す場合は、コピーのコストを避けるために const 参照渡しを使うのがC++の定番のプラクティスです。「値を変更したいなら通常の参照」「読み取り専用で渡したいならconst参照」「小さな基本型なら値渡し」という基準で使い分けるとよいでしょう。
-
WhatsApp vs Telegram 徹底比較|どちらを選ぶべきか徹底解説
通信技術の進化により、数多くのインスタントメッセンジャーアプリが登場しました。その中でも特に人気が高いのが「WhatsApp」と「Telegram」ですが、この2つのどちらを選ぶべきか迷う方も多いのではないでしょうか。本記事では、両アプリの共通点と相違点をセキュリティやプライバシー機能などのさまざまな観点から詳しく解説し、個人利用にもビジネス利用にも最適なメッセンジャーの選び方をご紹介します。 Part 1:TelegramとWhatsAppの基本情報 Telegramとは Telegramは2013年、ニコライ・ドゥロフとパーヴェル・ドゥロフの兄弟によって開発されました。二人は、経営していた
-
Xbox One XとXbox One S徹底比較:どちらを選ぶべきか?
2017年11月8日、Microsoftは待望の史上最強ゲーム機「Xbox One X」をついに発売しました。これに合わせて、Xbox One Sの価格も値下げされています。しかし、両機種ともスタイリッシュなデザインで4Kコンテンツに対応し、名前もよく似ています。では、なぜ価格に差があるのでしょうか?どちらが優れており、One Xはその価格に見合う価値があるのか気になるところです。本記事では、両コンソールの主な機能を比較しながら、その共通点と違いを詳しく解説します。両コンソールの共通機能まずは、Xbox One XとXbox One Sに共通する機能から見ていきましょう。USBポート最初の共通