C++には変数の値を渡す際に3つの方法があります。
今回はそれぞれの値の渡し方について簡単に説明していきます。
値渡し
値をそのままコピーして渡します。
int value = 5; int n = value; // 値渡し
一番よく使う値の渡し方です。
メリット
値がコピーされるので n の内容を変更してもコピー元のvalueには影響しないので管理が簡単です。
デメリット
値をコピーしているのでサイズの大きな構造体やクラスの場合にはコピーに大きなコストがかかる場合があります。
ポインタ渡し
int value = 5; int* n = &value; // ポインタ渡し
メリット
変数のアドレスをコピーして渡すので変数の型に関わらずポインタのサイズ分しかコピーがされないため、比較的に高速です。
ポインタの中身を変更することで value の値を変更することができます。
デメリット
ポインタの中身を変更することで value が変更されるため、正しく管理をしなければ意図せずに値の変更が行われてしまう可能性があります。
参照渡し
int value = 5; int& n = value; // 参照渡し
メリット
変数の参照を渡すことで n と value は同じ物として扱われます。
コピー等が走らないので高速です。
n の値を変更することで value の値を変更することができます。
デメリット
参照先の値を変更することで value が変更されるため、正しく管理をしなければ意図せずに値の変更が行われてしまう可能性があります。
ポインタと参照の違い
値の渡し方を3つ紹介しました。
それぞれのメリットとデメリットを読んでみると1つ疑問が出てくるかと思います。
ポインタ渡しと参照渡しの違いが分からない。
速度が参照渡し方が早いからポインタ渡しは下位互換なんじゃないか?
確かに今回のメリットとデメリットだけをみるとそうなります。
ですが、ポインタには参照にはない機能が存在しています。
それは不定な数の配列を渡す際やNULLを入れることができる点です。
参照の場合は配列も使用できますが要素数が固定である必要があります。
NULLも直接は入れられません。
※NULLの入ったポインタを*で無理やり入れることはできますが…。
ポインタ
- NULLが入れられるのでNULLチェックができる
- 可変の要素数の配列を扱うことができる
参照
- 有効な変数がであることが程度保証される
- 固定の要素数の配列を扱うことができる
なのでそれぞれ用途によって使う方を選ぶ必要があります。
皆さんも速度や用途に応じて変数を使い分けて値の渡し方をマスターしてください!