ここから本文です

C++言語の値渡しと参照渡しについての質問があります。

sci********さん

2018/11/2016:24:32

C++言語の値渡しと参照渡しについての質問があります。

値渡しは、変数の値がコピーされる渡し方であり、ある関数内でその値が変化したとしても実引数の値は変化しないのであり、参照渡しの場合は変数のメモリ番地を渡すことになるから実引数側の値も変化することは理解できました。しかし、どのような時に参照渡しとしなければならないのかがよくわからないため、質問させていただきました。例えば、2つの値を交換する関数であれば参照渡しにしなければならないのだと思いますが、他に、参照渡しでなければならないような関数の例を教えていただきたいです。
ご回答、宜しくお願い致します。

閲覧数:
101
回答数:
8

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

編集あり2018/11/2021:54:00

『どのような時に参照渡しとしなければならないのか』

コピーが作れない時です。

作る方法が不明な時と、本当に無理な時の2種類が考えられます。



『例えば、2つの値を交換する関数であれば参照渡しにしなければならないのだと思いますが』

ですね。

それは目的に由来しています。「交換する」ということなので。

でも、上記のようにコピーが作れないとか、作る方法が不明とか、そういった場合は形式的に他に選択肢が無いです。(ポインタで対処できますが、参照とポインタとを同じものとする立場でのお話です。)



『参照渡しでなければならないような関数の例を教えていただきたいです』

ikt********さんのお話の通りです。

std::ostream のコピーを引数に渡すとか、そういうことは出来ませんので。



《参考》

「参照渡しとしなければならない」のではないけれども、「参照渡し」が常識となる場面が多々あります。

こうお考え下さい。

クラスや構造体のインスタンスを渡すときは参照。


void f(const std::vector<int>& a)
{
for (const auto& i : a)
std::cout << i << std::endl;
}


こんな感じです。std::vector のコピーは作ることが出来ます。でも、無駄ですよね。そういう無駄は避けるのが当たり前です。なので上記のように参照にするのが常識となっています。

for 文で const auto& としました。これは const auto でも良かったのですけどね。int でも良いですよ。単なる習慣です。int 型以外に変更したくなったとき、どのように書いてあれば都合が良いのかは明らかですよね。

質問した人からのコメント

2018/11/22 15:31:00

とても丁寧にご回答していただき本当にありがとうございます。
自分の疑問点を解消することが出来ました。
今、ポインタのポインタについて学習しており、自分にとっては少し難しいと感じているところですが、頑張って勉強していきたいと思います。助かりました。

ベストアンサー以外の回答

1〜5件/7件中

並び替え:回答日時の
新しい順
|古い順

kon********さん

2018/11/2117:17:01

++では、ポインタの代わりに参照を使えます。
参照はポインタと異なり参照先を変更することが
出来ないとか、[]演算子を用いて、配列風に
取り扱うことが出来ない等の制限がありますが、
逆に言えばポインタのそういった強力過ぎる
性質によって引き起こされるコーディングミス
が生じにくいというのがありますので、
「参照に置き換えても良いポインタは参照に置き
換えるようにする」
というコーディングルールを採用する開発現場も
あるかもしれません。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

2018/11/2100:02:07

文字列などを含めて、配列の内容を操作する場合。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

2018/11/2019:51:51

極端に言えば、8バイトを超えるデータを
異なる関数で使いたい時

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

meigr01さん

2018/11/2019:39:10

関数を使うとき、値渡しで処理結果を欲しいとき、1個なら戻り値に設定して取得できますが。
複数有れば、関数内で必要な処理を実行します。
よく出てくるのは配列の複数要素の書き換えです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

dsy********さん

2018/11/2018:18:56

当たり前だけど
コピーコンストラクタの引数。
class type
{
type(const type&); // <=これ
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる