Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。
2010年1月23日

Java の参照と C++ の参照

Java の関数の仮引数での参照渡しと C++ の(参照型での)参照私の違いについて. see also: http://d.hatena.ne.jp/tt_clown/20100123/1264245560
9
木村屋 @kimuraya

Javaでは、参照型を引数として渡す時は、C++で言う参照渡しに相当する処理を行っているようだな。そうでないと、Javaの動作は説明出来ない。

2010-01-20 22:57:49
ぐるぐる系SQL @bleis

@kimuraya よくある勘違いですけど違いますよ。Javaで参照型を引数として渡すときは、意味的にはC++で言うポインタ渡しに近いです。 [Gitについて話します http://bit.ly/4q96FX]

2010-01-20 22:59:18
ぐるぐる系SQL @bleis

@kimuraya あと、Javaの「参照」とC++の「参照」は別物なので注意が必要です [Gitについて話します http://bit.ly/4q96FX]

2010-01-20 22:59:45
TODA, not TOAD @Kengo_TODA

Javaは参照という値を渡すという意味で、参照渡しではなく値渡しです。ややこしい。

2010-01-20 23:02:30
ぐるぐる系SQL @bleis

Javaの参照(参照値)はアドレスに近いのに対して、C++の参照は別名のこと [Gitについて話します http://bit.ly/4q96FX]

2010-01-20 23:06:21
木村屋 @kimuraya

@isoparametric 引数として、参照変数を渡した後、オブジェクトの内容を変更したり出来るため、参照渡しではないかと思いました。実際には、オブジェクトへの参照を値渡しする事で実現しているそうですね。堂々と間違いを書き込んでしまい、恥ずかしい思いです(笑

2010-01-20 23:13:26
木村屋 @kimuraya

@kazoo04 ご指摘、ありがとう御座います。文献で確認したところ、Javaの場合は原則、値渡しなようです。参照変数の場合は、オブジェクトへの参照のビットパターンを値渡しでコピーして、他のクラスのメソッドで呼び出したりしているようですね。

2010-01-20 23:15:37
Yuki Tamura @isoparametric

@kikairoya C++の参照と比較して、元の変数を書き換えられない意味で、ポインタ渡しと同等という感じだと認識しやすいのかなあと。>Javaの参照の値渡し

2010-01-20 23:18:35
ぐるぐる系SQL @bleis

@kazoo04 C#は値型の値渡し、参照型の値渡し、値型の参照渡し、参照型の参照渡しとあってうがー!ってなることがある。主に他人に説明する必要が発生するたびに [Gitについて話します http://bit.ly/4q96FX]

2010-01-20 23:20:09
Yuki Tamura @isoparametric

@kimuraya ああ、なるほど。そういうことですね。そういう意味では参照は渡っているので納得しました。 Javaは指しているオブジェクトの参照が値で渡されるだけですが C++の参照渡しは元の値が書き換えられる別名の意味での参照が渡っているんですよね。それで総ツッコミ、難しいw

2010-01-20 23:20:29
fgtrjhyu @fgtrjhyu

@kimuraya C++の参照渡しは`本物の'参照渡しなので呼び出し先に「変数を」渡す。呼び出された関数が引数に値を代入すると呼び出し元の`変数の内容が'変わる。

2010-01-21 00:09:04
ぽたうん(ね) @portown

C++で operator. がオーバーロードできれば、Javaみたいないわゆる「スマート参照」が作れるんだろうけど、operator.を許したら相当カオスになりそうな予感

2010-01-22 23:20:58

コメント

なぎせ ゆうき @nagise 2010年1月25日
「Javaは参照の値渡し」なんだけど、禅問答のような表現だからなかなか理解できない。
0
Tsuyoshi CHO @tsuyoshi_cho 2012年5月3日
スタックにポインタ載せるかどうか、あたりが関係するかな?Javaの場合はまあ、そういう意味で問題になることはないとも思うけど(通常の範囲)
0