東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

今日はちょっと熱がある...

値渡し(call-by-value) あるいは 値型(value-type)

 僕の手元にリンゴがひとつある。
 このリンゴのコピーを作り、「あげるよ」とあなたに手渡す。
 あなたがこのリンゴを煮て食おうが焼いて食おうが
 フルーツナイフでうさぎさんこしらえようが僕のリンゴは無傷。

参照渡し(call-by-reference) あるいは 参照型(reference-type)

 僕の手元にリンゴがひとつある。
 このリンゴを指差し、「あげるよ」とあなた告げる。
 あなたがこのリンゴを齧れば僕のリンゴに傷がつく。

「参照渡し」ってコトバからは「間接的」なイメージがあるのに、
実はこっちの方が「直接的」なんだねー。

コピーと原本の違いとでも言えばいいだろうか、
原本をコピーしたものは原本じゃなくなるから、
原本を僕の手元に残したままあなたに渡すには指差す(参照)しかないわけな。

# 値と参照をうまーく説明する「たとえ」を探しています。

投稿日時 : 2009年5月11日 14:07

コメントを追加

# re: 今日はちょっと熱がある... 2009/05/11 14:35 みきぬ

仕事を頼むときに、
1.書類をコピーして「これをもとにお願いね、チミ」
2.書類の場所を教えて「ここにあるのをお願いね、チミ」

# re: 今日はちょっと熱がある... 2009/05/11 14:44 ぱると

DVDを買うときに「あのDVDください」と言ったら店の奥から同じものを取ってきた
DVDを借りる時に「あのDVDください」と言ったら「あの棚にありますよ」と言われた。

# re: 今日はちょっと熱がある... 2009/05/11 14:44 ぱると

いや…なんか違うな…orz

# re: 今日はちょっと熱がある... 2009/05/11 14:45 ぱると

DVDを借りる時に「このDVDください」と言ったら持ってきたDVDを貸してくれた。
かな。

# re: 今日はちょっと熱がある... 2009/05/11 14:49 επιστημη

どシロートにもすんなり呑んでもらえそうな、
直感に訴えるよな「たとえ」が欲しいのね。

Equality(等値性)とIdentity(同一性)との違いてゆーか、うーむ...やっぱ熱ある。

# re: 今日はちょっと熱がある... 2009/05/11 14:50 επιστημη

...どっちがどっちだかわかりにくくね? > ぱるとさん

# re: 今日はちょっと熱がある... 2009/05/11 15:00 ぱると

懲りずに再挑戦
プリントと回覧板(連絡網)ってのはどうでしょう?
学校で全員に配るプリントが値渡し
回覧板(連絡網)が参照渡し
プリントに落書きしても誰も困らないけど、回覧板に落書きすると後で使う人が困る。

# re: 今日はちょっと熱がある... 2009/05/11 15:03 ぱると

また連投…
回覧板は必要な情報を上書きできます。
(閲覧したよ~っていうサイン等)
なので回覧板に何も書いちゃいけないのではなく、書く必要もある事があるって言いたかったです。

# re: 今日はちょっと熱がある... 2009/05/11 15:05 りょう

曲データとかに例えてみては?
iPod(A)に曲が入ってて新しいiPod(B)に曲を入れて渡す
iPod(A)にイヤホン(リモコン付き)を差し込んでイヤホンを渡す
どっちも曲は聴けるけど、後者は早送りすると元の曲の流れている位置も変わるとかー

# re: 今日はちょっと熱がある... 2009/05/11 15:13 アクア

僕には美人で気立ての良い自慢の彼女がいる。
僕は「こんな彼女を見つけなよ」と友人に見せる。
見事、彼女のような素敵な女性を見つけた友人が…(以下略。

# re: 今日はちょっと熱がある... 2009/05/11 15:14 774RR

複写渡し vs 別名渡し と呼んでいるような気がする

ある書類を複写したら元のものとは別もの
ある書類に別名をつけても同じ書類

# re: 今日はちょっと熱がある... 2009/05/11 15:16 ぱると

参照渡しだと結局元サヤになるけど友人の癖がつくわけですね、わかります。>アクアさん

# re: 今日はちょっと熱がある... 2009/05/11 15:27 επιστημη

> 複写渡し vs 別名渡し

あー。「コピー渡し vs 原本渡し」 とキホン同じだけど
"名前変えても同じもの"てとこがミソなのか。

結構イケてっかも♪

他になぁい? もっとこー、グッとくるやつ。

# re: 今日はちょっと熱がある... 2009/05/11 15:32 biac

call-by-value で手元のリンゴが無事、 ってのは言語仕様に依存しませんか?
スタックに積んだ引数を呼び出し元では使わない、 っていうことまで、 "call-by-value" の意味に含まれてるんでしたっけ?

モノを渡すか、 モノの在処を示すおフダを渡すか、 って違いだけで。 手元のリンゴが無事で済むかどうかは、 別問題だと思ってるのですけど。

# re: 今日はちょっと熱がある... 2009/05/11 15:33 Jun No.2

ぱるとさんからアイデアを得て。

自宅で録画したTV番組を友達が見たいと言ったとき、
ダビングしてあげる VS 手元のテープをそのまま渡す
というのは?

# 地デジだけになったら通用しなくなるかも。
# というか、もうテープの時代じゃないのかな。

# re: 今日はちょっと熱がある... 2009/05/11 15:37 επιστημη

> スタックに積んだ引数を呼び出し元では使わない、 っていうことまで、 "call-by-value" の意味に含まれてるんでしたっけ?

呼び出し元が"コピー"をスタックに積むのが値渡しなんだからスタック内をいぢくってもいぃんでね?

# re: 今日はちょっと熱がある... 2009/05/11 15:40 επιστημη

> ダビングしてあげる VS 手元のテープをそのまま渡す

NASに溜め込んだ番組をFTPで流せば値渡し。
NASのURLを教えてあげれば参照渡し。
ナンチテー

# re: 今日はちょっと熱がある... 2009/05/11 15:45 774RR

そもそも call-by-value という言い方が良くないんだろう。
少なくとも C/C++ では「複写したもの」を渡すわけで、
それならば call-with-clone とでもすべきかも。

複写した(=元のものとは別)ブツを操作したらそれだけで
複写元のブツにも影響が及ぶ、ようなクラスを作ったのならば
そりゃそういう設計なんだからしょうがない・・・

# re: 今日はちょっと熱がある... 2009/05/11 15:55 画伯

「私」と「私の中の悪魔」

# re: 今日はちょっと熱がある... 2009/05/11 16:02 biac

> 少なくとも C/C++ では「複写したもの」を渡すわけで

C/C++ でポインタを渡すときも、 そのアドレス値は 「複写したもの」 なわけで。 なので、 呼び出し先がポインタ自体を書き換えたりしても、 呼び出し元は困らんわけで。

# re: 今日はちょっと熱がある... 2009/05/11 16:02 επιστημη

>「私」と「私の中の悪魔」

いやまグッとくるけどね。
# ウケ狙うとこじゃないから、ここ。

# re: 今日はちょっと熱がある... 2009/05/11 16:05 επιστημη

> C/C++ でポインタ

いやそれはCに参照渡しの構文がないから
ポインタを値渡しして(参照代わりに使って)るだけで。

# re: 今日はちょっと熱がある... 2009/05/11 16:32 画伯

失礼しました・・・。

# re: 今日はちょっと熱がある... 2009/05/11 16:54 アクア

私や画伯はでるまく無いよね。>画伯
あらためて、επιστημηさんごめんなさい。

で、ちょっとだけ真面目に書かせて貰うと、確かにここら辺は理解するのに苦労しました。
で、私の経験からなんですが、イメージで理解させる事も重要なんですが、
私は結局、何度か自分でサンプル書いて無理やり自分に叩き込んだような記憶があります。
併用して示すサンプルで分かりやすいモノってどんなのが適当なんでしょうか?
そこら辺りもあると非常に助かるんですが…

脱線で申し訳ないです。

# re: 今日はちょっと熱がある... 2009/05/11 17:16 επιστημη

> 併用して示すサンプルで分かりやすいモノ

値渡し/参照渡しは
VBなら ByVal/ByRef
C#なら ref/outの有無
でサンプル書けます。

が、値型/参照型の挙動の違いはかなり面倒に思えます。
値型のように振舞うstringが参照型なんだぜ?
ヒネクレまくった参照型であるstringが
いっちばんよく使われてんだぜ?

C++はその点単純。
値渡し/参照渡しは &の有無で明示するし、
値型/参照型なんて区別がない、ぜーんぶ値型。

.NETでは 値型/参照型 と 値渡し/参照渡し とで
4通りのコンビネーションが発生する。

# re: 今日はちょっと熱がある... 2009/05/11 17:18 επιστημη

で、そろそろ稀代の伝道師、かるぼセンセの降臨か!?

# re: 今日はちょっと熱がある... 2009/05/11 17:20 K5

値渡し 財布を2個用意して同金額入れておく(双子の小遣い)
参照渡し 1つの財布を一緒に使う(夫婦の資産)

…επιστημηさんの最初の説明と変わらんorz

# re: 今日はちょっと熱がある... 2009/05/11 17:35 επιστημη

待てみんな、じきにかるぼ導師が降臨めされて
快刀乱麻に解決してくださるぞっ!

# はい、大好きですよ、かるぼいぢり。

# re: 今日はちょっと熱がある... 2009/05/11 17:36 ぱると

僕もネタにのっかってしまってごめんなさい…。

# re: 今日はちょっと熱がある... 2009/05/11 17:39 にくきゅう

ファイルのコピーとハードリンクなんかも
同じような感じですね。

参照渡しは「使っても良いよ」みたいなイメージがあります。
誰かにそれ使わせてって言った時に、
「それじゃコレあげる」と同じ物をくれるのが値渡し。
「使っても良いよ」と使わせてくれるのが参照渡し。
みたいな。

# re: 今日はちょっと熱がある... 2009/05/11 17:44 επιστημη

ネタも歓迎よ、「たとえ」として見事なら♪

# re: 今日はちょっと熱がある... 2009/05/11 17:45 aetos

マニアックな世界では第3、第4の呼び出し方法もあるとか。
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4-05w/text/eopl014.html#toc18

引数の値や参照の代わりに、その値を返す関数を渡す。
同じ関数を複数渡した時、毎回評価するのが「call by name」、1回しか評価しないのが「call by need」だそうだ。

# re: 今日はちょっと熱がある... 2009/05/11 18:06 aetos

現実世界では「コピー」がそれほど容易でないから難しいのかも。紙くらいしかないよね、コピーできるものって。
あと、現実世界では、渡したら相手の手元に移動してしまってこっちに残らないということも少なくない。

# re: 今日はちょっと熱がある... 2009/05/11 20:56 やまだ

えーと、
おみやげを配るとき、
『ひとつひとつ手渡ししていく』のが値渡し、
『「ひとつずつ取って回してってー」と言って外箱ごと回覧する』のが参照渡し、
とか?

うーん、いまいちか……。

# re: 今日はちょっと熱がある... 2009/05/11 21:36 まどか

お店がメモリ。
おねぇちゃんがインスタンス。
電話番号書いた紙きれが参照。

○○さん家がメソッド。

おねぇちゃんがさんざん○○○されて
何事もなかったかのようにお店に帰るのがByVal。
証拠残して訴えられるのがByRef。

おねぇちゃんがまなかなならByValの説得力がマス。

メソッド内に「Sleep(3日)」が無いとつらい今日この頃

熱が無くてもこのくらい当たり前に書けるまどかでした。

#まじめな話、ByValのクローンは説明しにくいね。

# re: 今日はちょっと熱がある... 2009/05/11 22:14 Soda

関数という名の戦場へ、引数という名の兵隊を送り込むのに、

クローン兵を送るのが値渡し。
オリジナルを送るのが参照渡し。

どちらの兵隊も能力は同じ。
クローン兵は戻ってくると厄介なので使い捨て。
オリジナルは戦場で経験や怪我など変化して戻ってくる。
稀にエラーが発生して帰ってこない場合もある。

・・・遠隔操縦でフィードバックのほうが移動しないから参照っぽいかなぁ。

# re: 今日はちょっと熱がある... 2009/05/11 22:26 やじゅ

パーマンで説明すると
パーマンのコピーロボットが活動するのが値渡し
パーマンで活動するのが参照渡し
ってSodaさんと同じやね。

# re: 今日はちょっと熱がある... 2009/05/12 8:30 επιστημη

実世界では"コピー"のたとえが難しいすな。
"参照渡し"は...飼い犬を繋ぐ鎖をも一本つけて、
一本は僕が握ったままもう一本をあなたに渡すよな。

# re: 今日はちょっと熱がある... 2009/05/12 9:01 刈歩 菜良 CTP

よばれたきがした...
επιさん体調大丈夫ですか?
ぶたさんぢゃないですよね。
(^・^)

ちょっと、全部目を通せてないのですが、いっこだけ。

> 値型のように振舞うstringが参照型なんだぜ?

ココ認識が違うんですよねぇ。
文字リテラルは確かに特殊な扱いなんですが、Stringクラスは参照型としてわたしは違和感を感じないんです。

記事書きたいなぁ。
でも、まだεπιさんの宿題できてない...

まず、宿題は今日の午前中には上げまする。
ごめんなさい。
<(_ _)>

# re: 今日はちょっと熱がある... 2009/05/12 9:31 επιστημη

> よばれたきがした...

山のように呼んでますがなにか。

> ぶたさんぢゃないですよね。

カク━━━||Φ|(|゚|∀|゚|)|Φ||━━━リ!!!

> 文字リテラルは確かに特殊な扱いなんですが、
> Stringクラスは参照型としてわたしは違和感を感じないんです。

「mutableな(=自分自身を書き換える)メソッドが
 一個もない(から値型に見える)だけぢゃん!」てことスカ?

ま、いいや。今後のエントリをwktkして待ってます。

# re: 今日はちょっと熱がある... 2009/05/12 9:43 セラフ

こんちは。@ITで勘違いしまくって叩かれたセラフです。

やっぱり紙や書類以外にはいい例えが思い浮かびませんでした・・・。

社員に仕事を頼むとき、

・原本のコピーを渡すのが値渡し
・原本のある『場所』を渡すのが参照渡し

この例えの難しさってやっぱり

・値型の値渡し
現物の複製を渡す
・値方の参照渡し
現物の場所(アドレス)を渡す
・参照型の値渡し
現物の場所のメモのコピーを渡す
・参照型の参照渡し
現物の場所のメモの場所を渡す

で後半2つを形容できるものが、現実世界にはなかなか見つからないからなんでしょうね~。って書いてて、ひとつ思いつきました。

モデルハウスに例えて

・値型の値渡し
モデルハウスと同じ建物を別の土地に建てプレゼント
・値方の参照渡し
モデルハウスをそのままプレゼント
・参照型の値渡し
モデルハウスの住所をメモしたメモの複製をプレゼント
・参照型の参照渡し
モデルハウスの住所をメモした場所をプレゼント

う~む・・・やっぱり後半二つはしっくりこないし、場所のメモだけもらってもうれしくないな・・・

# re: 今日はちょっと熱がある... 2009/05/12 10:57 επιστημη

...やっぱ難しいよなー。

結局ヘタにたとえたりせず、「かるぼ式メモリー図」がもっとも的確にして明解なんだよなー。

そうなるとこのテの話するにはアセンブラとまではいかずとも、
「計算機てのはCPUとメモリーと入出力装置で構成されてて...」
ってゆー毎度おなじみのくだり(ノイマン型計算機のしくみ)は
理解しててもらわなならんちゅーことになっちゃうのかな。

# re: 今日はちょっと熱がある... 2009/05/12 19:56 刈歩 菜良 CTP

ちょっとすべてはカバーできませんが、参照型の説明を実世界に近い形で例えるのに、わたしは電話番号で説明しますよ。

本人がインスタンスで電話番号が参照情報(アドレス)。
電話かけてメッセージ投げる(メソッド実行)

電話番号コピーして他人にあげる(参照型の値渡し)

普通はここまでしか説明しないけど、ほかのパターンを説明するならば、

携帯を他人に貸してあげる/共有で使う(参照型の参照渡し)
# 携帯の電話番号が編集される可能性あり

で、どでしょ。

値型はほら、簡単ぢゃないですか。
無理に同じ例えを値型に使わんでもよいかと...

# re: 今日はちょっと熱がある... 2009/05/13 9:00 επιστημη

電話番号かー、なるほどねー

値:
「かるぼくーん宿題教えてー。「2+5=」ていくつぅ?」

参照:
「かるぼくーん宿題教えてー。教科書12ページ3番の答いくつぅ?」

タイトル
名前
URL
コメント