C++で関数にオブジェクトを渡す5つの方法を徹底解説!値渡しからポインタ渡しまで
C++では、オブジェクトを関数へ渡す方法が複数あります。ここでは、クラス X を関数 fun に渡す場合を例に、代表的な渡し方とそれぞれの特徴・使い分けのポイントを解説します。用途に応じて適切な方法を選ぶことで、パフォーマンスやコードの安全性を高めることができます。
1. 値渡し(Pass by Value)
オブジェクトの浅いコピー(シャローコピー)が関数のスコープ内に作成されます。関数内でどのような変更を行っても、呼び出し元のオブジェクトには一切影響しません。独立した作業用コピーが必要な場合に有効ですが、大きなオブジェクトの場合はコピーのコストに注意が必要です。
宣言
void fun(X x);
呼び出し
X x; fun(x);
2. 参照渡し(Pass by Reference)
オブジェクトへの参照が関数に渡されます。関数内で行った変更は、呼び出し元のオブジェクトにそのまま反映されます。オブジェクトのコピーは作成されないため、大きなデータを効率的に扱えます。
宣言
void fun(X &x);
呼び出し
X x; fun(x);
3. const参照渡し(Pass by Const Reference)
オブジェクトへのconst参照が渡されます。関数内ではオブジェクトを直接変更・再代入することはできません(ただし、内部状態を書き換えるメンバ関数の呼び出しは可能です)。読み取り専用としてオブジェクトを扱いたい場合に最適で、コピーも発生しないため、C++では非常によく使われる手法です。
宣言
void fun(X const &x);
呼び出し
X x; fun(x);
4. constポインタ渡し(Pass by Const Pointer)
オブジェクトへのconstポインタが渡されます。この方法では、ポインタ自体を変更・再代入することができません。関数に対して「このオブジェクトのアドレスだけ」を持たせたい場合に有効です。オブジェクトのコピーは作成されません。
宣言
void fun(X const *x);
呼び出し
X x; fun(&x);
5. ポインタ渡し(Pass by Pointer)
オブジェクトへのポインタが渡されます。挙動としては参照渡しに近く、関数内での変更は呼び出し元のオブジェクトに反映されます。参照渡しとの主な違いは、nullptr を渡せる点や、呼び出し側で明示的にアドレス演算子 & を付ける必要がある点です。コピーは作成されません。
宣言
void fun(X *x);
呼び出し
X x; fun(&x);
各渡し方の比較まとめ
最後に、5つの方法の違いを表にまとめます。目的に応じて最適な方法を選択しましょう。
| 渡し方 | コピーの有無 | 元のオブジェクトへの影響 |
|---|---|---|
| 値渡し | あり | 影響なし |
| 参照渡し | なし | 変更が反映される |
| const参照渡し | なし | 直接の変更不可(読み取り専用) |
| constポインタ渡し | なし | ポインタの再代入不可 |
| ポインタ渡し | なし | 変更が反映される |
一般的なガイドラインとしては、関数内でオブジェクトを変更しない場合は const参照渡し、変更する場合は 参照渡し または ポインタ渡し、完全に独立したコピーが必要な場合は 値渡し を選ぶのが推奨されます。
-
JavaScriptで無名関数(匿名関数)に引数を渡す方法をわかりやすく解説
JavaScriptにおける無名関数(匿名関数)は、名前を持たない関数であり、変数に代入したり、イベントリスナーのコールバックとして利用したりする際に非常に便利です。通常の関数と同様に、無名関数にも引数を渡すことができます。ここでは、具体的なコード例を通じてその方法を解説します。 無名関数への引数の渡し方 無名関数に引数を渡す基本的な方法は、関数を変数に代入し、その変数を通じて呼び出す際に引数を指定することです。以下は、ボタンをクリックすると無名関数が呼び出され、引数を受け取って計算結果を表示するサンプルコードです。 サンプルコード <!DOCTYPE html> <ht
-
【Swift】NSUserDefaultsにカスタムオブジェクトを保存・復元する方法を徹底解説
この記事では、アプリケーション内でカスタムオブジェクトをNSUserDefaultsに保存する方法を解説します。保存手順を学ぶ前に、まず「カスタムオブジェクトとは何か」を確認しておきましょう。カスタムオブジェクトとは、Int、Double、Stringといったネイティブなデータ型ではなく、独自に定義したクラスや構造体などのデータのことを指します。NSUserDefaultsへのデータ保存は、次の3つのステップで行います。1. カスタムオブジェクトの作成まず、name(名前)とage(年齢)の2つの変数を持つ、Personというカスタムクラスを作成します。NSUserDefaultsに保存するに