ASIPのRubyistなるままに このページをアンテナに追加 RSSフィード

2009-05-29

Ruby(Java)とC++のリファレンス(参照)の違い

07:31 | Ruby(Java)とC++のリファレンス(参照)の違いを含むブックマーク

Ruby変数は全てリファレンスです。

Java変数はプリミティブ以外全てリファレンスです、プリミティブは値です。

C++変数リファレンスポインタ・値をチャンポンできます。


ポインタがなくリファレンスのみなので、Ruby(Java)のリファレンスは、再代入

により何度でも参照先を変える事ができます。


C++の場合、リファレンス初期化時のみ参照先(アドレス)の指定が可能で、

以降、参照先(アドレス)を変えることはできません。(ご存知の通り、)ポインタ

アドレスの再代入により何度でも参照先(アドレス)を変えることができます。

既にポインタがあるので、リファレンスに上記のような制限が加えられて

いるのだと解釈しています。参照先の値は何度でも変えることができます。


Objective-Cリファレンス(参照)はありません。

Objective-Cは上手にポインタを利用している(プログラマの目に触れさせない

ように隠している)ので、ほとんどの場合、ポインタを意識する事なく

プログラミングできます。なので、リファレンス(参照)は必要ありません。


###

トラックバックhttp://talototo.blog48.fc2.com/blog-entry-451.html

にあるプログラム

Foo f(1);
Foo g(2)

は夫々

Foo f = Foo(1);
Foo g = Foo(2);

と等価で

Foo& fr = f;

frは変数fへの参照。frの参照先アドレスは変数fのアドレス(&f)。

fr=g;

はfrの参照先(アドレス)を変更しているのではなく、

参照frを介して変数fに変数gの値を代入しています。

トラックバック元のプログラムでfrの参照先(アドレス)は変更されていません。

 // fr = 0; // 無理

参照frの実体は変数fで、変数fの型はFooなので、型がFooでない0を代入しよう

としてコンパイルエラーになるのは当たり前ですではありません。

引数一つのコンストラクタを持つクラスを型とする変数への引数一つの

コンストラクタ引数と同じ型の値の代入の場合、クラス定義において引数一つの

コンストラクタの定義に対してexplicitキーワードによる修飾を行っていないと

暗黙の型変換が行われます。

トラックバック先にあるプログラムではexplicitキーワードによる修飾を

該当コンストラクタに対して行っているので暗黙の型変換、

fr = Foo(0)

への暗黙の型変換は無効であり、コンパイルエラーとなります。


[追記 6/15]

勘違い?をしていたので、上記の###以降を修正しました。

トラックバック - http://d.hatena.ne.jp/asipruby/20090529/1243549902