値渡し、参照渡し、ポインタ渡しを議論する

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
とにかくウザイくらい「値渡し、参照渡し、ポインタ渡し」の議論が至るところで成されています。
このスレを用いて白熱した議論をお願いします。
2デフォルトの名無しさん:2006/03/14(火) 16:41:59
変数、
変数のアドレス、
変数が指し示す値
変数が指し示す値のアドレス

があります。ここで、それぞれに対して以下の定義を行います。
変数
 メモリ空間上の特定の領域に名前をつけたものでし。

変数のアドレス
 変数がメモリ上のどの位置(アドレス)にあるかを表す値です。

変数が指し示す値
 読んで字のごとくです。

変数が指し示す値のアドレス
 ”変数が指し示す値”をメモリに確保する方法が主に2種類あります。
  ・変数(が占有するメモリ領域)に値そのものを保持する場合
  ・変数とは別のメモリ領域に保持する場合

 前者の場合、変数が指し示す値のアドレス=変数のアドレス
 後者の場合、変数が指し示す値のアドレス≠変数のアドレス

で、値渡し、参照渡し、ポインタ渡しを定義すると

値渡し:変数が指し示す値 を渡すこと。
参照渡し:変数のアドレス を渡すこと
ポインタ渡し:変数が指し示す値 を渡すこと。ただし、変数が指し示す値とは 値のアドレス です。
3デフォルトの名無しさん:2006/03/14(火) 16:52:10
終了
4デフォルトの名無しさん:2006/03/14(火) 16:52:13
5デフォルトの名無しさん:2006/03/14(火) 16:53:02
ポインタ渡し:変数が指し示す値のアドレス を渡すこと

ですね。すみません。
6デフォルトの名無しさん:2006/03/14(火) 16:53:06
7デフォルトの名無しさん:2006/03/14(火) 17:08:00
他人に説明できるほどには理解できてないようだな。
ポインタは値だ。
ポインタの値渡しとポインタの参照渡しがある。
8デフォルトの名無しさん:2006/03/14(火) 17:09:39
ポインタの参照を渡す

void f(char &*p)
{
;
}
9デフォルトの名無しさん:2006/03/14(火) 17:12:30
こらこら、名前渡しを忘れてはいけない。
http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0
10デフォルトの名無しさん:2006/03/14(火) 17:15:03
矢切の渡し
11デフォルトの名無しさん:2006/03/14(火) 17:26:11
lisp は何私?
12デフォルトの名無しさん:2006/03/14(火) 17:34:34
あたい、私
13デフォルトの名無しさん:2006/03/14(火) 17:40:44
さっぱり分からん。
最初の変数をオブジェクトに変えて定義してくれ。
14デフォルトの名無しさん:2006/03/14(火) 17:56:03
「変数が指し示す値」みたいな俺用語を「読んで字のごとくです」なんて言われてもな
「値のアドレス」て、もうアホかと
15デフォルトの名無しさん:2006/03/14(火) 19:39:11
名前渡しムツカシス
16デフォルトの名無しさん:2006/03/14(火) 19:48:17
【積年の】旦那にしてる密かな仕返し【恨みじゃー】
http://human5.2ch.net/test/read.cgi/ms/1141694640/

8 名前:可愛い奥様[] 投稿日:2006/03/07(火) 11:05:23 ID:8dtluKkp
夫の歯ブラシで洗面所の排水溝掃除。
洗面所をビショビショに汚した罰だ。

20 名前:可愛い奥様[age] 投稿日:2006/03/08(水) 00:40:17 ID:pRrk6A21
前に頭きた時あって
1度だけ歯ブラシで肛門カキカキしちゃった

22 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:27:12 ID:gU5mHc7J
よかった。どこのお宅も同じようなことしてて。

24 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:36:35 ID:SSSFsTqE
そうそう、ヘンなモノはダンナのお皿へ直行だよね。

41 名前:可愛い奥様[] 投稿日:2006/03/08(水) 11:55:18 ID:sjj+/60Q
見てるだけで気が晴れるな!
皆さん、頑張ってね!

42 名前:可愛い奥様[sage] 投稿日:2006/03/08(水) 20:33:51 ID:Ju2N1s7+
年金分割が楽しみじゃのう

63 名前:可愛い奥様[] 投稿日:2006/03/10(金) 08:55:20 ID:qLfJYpJR
家族で密かにはぶっている。

男性は肉体が汚く、精神が美しい傾向がある。(気に入らない相手に肉体的攻撃を加える⇒精神的攻撃も加える男は猛者)
女は肉体が美しく、精神が汚い傾向がある。(気に入らない相手に精神的攻撃を加える⇒肉体的攻撃も加える女は猛者)
女は隠れて悪事をする。気に入らない女子を便所でボコったり、便器舐めさせたり、男の友人を使ってレイプ、仲間外れにしたり。陰口、嫉妬。
女は対人関係において、この汚い性格を隠そうとするため、外面が非常によくなる。(猫かぶり)
男性諸君は外面に騙されないように気を付けて下さい。
17デフォルトの名無しさん:2006/03/14(火) 19:57:41
マクロと同じ
18デフォルトの名無しさん:2006/03/14(火) 22:24:47
>>16
読んでて泣きそうになった
どこのお宅もry
19デフォルトの名無しさん:2006/03/14(火) 22:36:02
鬼女板なんて基地外のあつまりだから、真に受けてるとアホ見るよ。
そりゃ女なんてそんな綺麗なもんじゃないけどさ。
20デフォルトの名無しさん:2006/03/15(水) 01:39:21
グローバル変数渡し最強
21デフォルトの名無しさん:2006/03/15(水) 01:56:35
グローバルなら渡す必要ないだろが
22デフォルトの名無しさん:2006/03/15(水) 02:53:28
渡すから最強なんだ
23デフォルトの名無しさん:2006/03/15(水) 06:08:57
シリアライズ渡し最強。
現金手渡し最強。
24デフォルトの名無しさん:2006/03/15(水) 08:27:35
見事に
25デフォルトの名無しさん:2006/03/15(水) 12:04:54
部屋とYシャツと渡し
26デフォルトの名無しさん:2006/03/15(水) 21:54:44
>>15
Cのマクロは名前渡しだよ。

呼出し側のコンテキストで引数を評価する。
27デフォルトの名無しさん:2006/03/15(水) 22:26:20
名前渡しって、文字列をそのままコードとして評価するということ?
誰か分かりやすく教えてよ。
28デフォルトの名無しさん:2006/03/16(木) 11:40:14
call 関数(引数1=1,引数2=2)とcall 関数(引数2=2,引数1=1)が等価
29デフォルトの名無しさん:2006/03/16(木) 12:35:57
ByValで値、ByRefで参照だっつってんだろ。
これ以上何を。
30デフォルトの名無しさん:2006/03/16(木) 13:29:11
VBのByValは引数のコピーを作ってそれの参照渡しをする事
31デフォルトの名無しさん:2006/03/16(木) 16:13:10
ByValは、値そのものを渡して、
ByRefは、変数の入っているメモリのアドレスを渡すのでは。
32デフォルトの名無しさん:2006/03/17(金) 10:42:31
>>27
正規評価とか正規順序という言い方もする。
要するに実引数を評価せずに式をそのまま渡して、
関数呼び出しを関数本体(の仮引数を実引数に置き換えたもの)と置き換える。

例えば>>9のswapの例では
swap(i, a[i])という呼び出しは本体のx,yがi,a[i]に置き換わった上で、
本体ブロックと置き換えられるから
{
 tmp = i;
 i = a[i];
 a[i] = tmp;
}

をそのまま評価することになる。
つまり、Cだとマクロで引数に式を渡すのと同じこと。
33デフォルトの名無しさん:2006/03/18(土) 03:04:10
で、おまいらは何渡しが最強だと思うんだ?

BASIC -> Z80 -> FORTRAN -> C/C++ ときた俺には、参照渡しが最も軟弱だと思う
まあ、const とか [in] とかの modifier が付けられればどうでもいいのだが
34デフォルトの名無しさん:2006/03/18(土) 15:24:41
最強とかどうでも良いだろ
適材適所って言葉知らんのか
35デフォルトの名無しさん:2006/03/18(土) 16:55:55
そんな言葉、知っていればこんなスレには来ぬわ!
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
37デフォルトの名無しさん:2006/03/18(土) 20:31:14
dereferenceって日本語でなんていうの?

言葉遊びの問題じゃなくて、c++とかjavaの構文でわからない事があったが
デリファレンスで検索してもperlしかひっからなくて昔困ってた
38デフォルトの名無しさん:2006/03/18(土) 22:12:48
>>37
何種類かの訳語があるようだけど、間接参照かな。

dereferenceで日本語のページを検索するといいかも
39デフォルトの名無しさん:2006/03/18(土) 23:38:03
>>37
ここにdereferenceの訳が幾つも挙げられているよ。作者は脱参照という新語を提案しているが。
http://www.fides.dti.ne.jp/~oka-t/cpplab-dereference.html

ちなみにC/C++のJIS規格書ではたしか*演算子のことを間接参照演算子と呼んでいたはず。
40デフォルトの名無しさん:2006/03/19(日) 00:10:03
>>38-39
ありがと
間接参照が一番メジャーっぽいか
41デフォルトの名無しさん:2006/03/19(日) 01:11:27
deference = たぐり(手繰り) っつうのは?
42デフォルトの名無しさん:2006/03/24(金) 00:47:39
>>41
俺用語を増やすな
43デフォルトの名無しさん:2006/04/04(火) 18:57:43
defence = ふせぎ(防ぎ)っつうのは?
44デフォルトの名無しさん:2006/04/07(金) 13:07:56
dependence = いぞん(依存)っつうのは?
45デフォルトの名無しさん:2006/04/07(金) 14:22:41
46デフォルトの名無しさん:2006/05/04(木) 18:27:10
ポインタ不要論読ませてもらったけど
すごくよくできてるサイトだね
47デフォルトの名無しさん:2006/05/04(木) 18:55:30
>>46
ググったらトップにくるとこ?
48デフォルトの名無しさん:2006/05/04(木) 19:36:29
むしろポインタ不要論を読むことで、ポインタでありがちなミスを防いで
ポインタを使うテクニックを覚えられた。感謝
49デフォルトの名無しさん:2006/05/04(木) 20:19:55
もうレキシカルクロージャでいいじゃん。
50デフォルトの名無しさん:2006/05/05(金) 00:20:32
Pythonは全てが参照渡しでいいのかな。
51デフォルトの名無しさん:2006/05/05(金) 00:56:09
>>39
個人的には「参照脱がし」がいい。
52デフォルトの名無しさん:2006/05/05(金) 02:25:22
>>1
突き詰めると、全部同じ事を意味するんだがな。
53デフォルトの名無しさん:2006/05/05(金) 08:34:47
同じにしてどうする。
そういうのをミソもクソも一緒って言うんじゃないかと。
54デフォルトの名無しさん:2006/05/05(金) 08:49:48
ポインタの実体渡しと、実体のポインター渡しw
55デフォルトの名無しさん:2006/05/05(金) 08:53:01
名前渡しってのはどう? cのマクロみたいなもんだけど
56デフォルトの名無しさん:2006/05/05(金) 09:07:02
>>55
OracleのPL/SQLにあるよね。func_name(arg2=>'value1')とか書くやつ。
引数リストの端になくても省略可能にできるから、結構便利なんだよね。
57デフォルトの名無しさん:2006/05/05(金) 10:19:54
>>37
逆参照が直感的でわかりやすい
58デフォルトの名無しさん:2006/05/05(金) 10:44:37
いや、名前渡しってのは、変数名や式そのもが渡せるもの
59デフォルトの名無しさん:2006/05/05(金) 11:03:20
>>56
28でも間違ってるけどそれはただの名前つき引数
60デフォルトの名無しさん:2006/05/05(金) 11:10:07
>>58
それでも、式の書かれてるアドレスを渡してるか、式の書かれた文字列をコピーで渡してるかどっちかでしょ?
61デフォルトの名無しさん:2006/05/05(金) 11:11:20
CPUの世界には、ポインター渡しか、値渡しのどっちかしかないんだからさ。
62デフォルトの名無しさん:2006/05/05(金) 12:51:24
いや、メモリとレジスタの間の代入しかありませんがな
63デフォルトの名無しさん:2006/05/05(金) 14:20:34
>>62
レジスタもメモリの一種と考えたほうがスッキリしまふ
64デフォルトの名無しさん:2006/05/05(金) 14:37:03
結局メモリなりレジスタの内容を何かに見立ててるだけで

では誰が見立てているかというと、コンパイラではない。
それが出来るのは人間でしかなく
参照とか値とかいうのは、人の頭のどっかにしか無いものなのだ。

だからこそ、参照とかポインタという概念は数という概念に比べれば厄介なのかもしれない。
65デフォルトの名無しさん:2006/05/05(金) 22:48:57
>>54
意味ねぇぇぇぇwwww
66デフォルトの名無しさん:2006/05/06(土) 06:18:43
最悪なのは

*使った場合と&使った場合とかの理解がごっちゃ混ぜ、
挙句char*とStringクラスまで大混乱した状態で頭に入ってしまった場合w

>>45サイトは便利だけど、一通りポインタ使えるようになった後で
移行した方が良さそうだなあ
67デフォルトの名無しさん:2006/05/06(土) 09:23:57
参照とポインタの違いが分からん。
参照もポインタも何かのアドレスを指している?
68デフォルトの名無しさん:2006/05/06(土) 09:28:09
それより 代入が参照のコピーなのか実体のコピーなのか判らん言語が横行してるのが気に喰わん

C言語はその点 漢だな
69デフォルトの名無しさん:2006/05/06(土) 09:29:36
>>67
ポインタは参照する為の入れ物

参照というのは、その参照を隠したもの
70デフォルトの名無しさん:2006/05/06(土) 09:42:05
値渡し→boost::call_traits<T>:param_type
参照渡し→boost::call_traits<T>::reference
でおk
71デフォルトの名無しさん:2006/05/06(土) 10:01:38
>>69
ごめん、余計にこんがらがった。orz
72デフォルトの名無しさん:2006/05/06(土) 10:18:24
>>71

ポインタというのは、まあURLみたいなもんだ
そのURLで指した所にWebのページなりファイルなりがあるわけだ。

で、実体渡しというのは、自分のPCにファイルをコピーしてる状態ね。
それを参照するというのは、ファイルを置いたまま、眺めたり直接変更するような事だな。
実体を弄ってもコピーだから本体には影響しないけど、参照で触ると本体が書き換わってしまう。


参照で渡すというのは、その仕掛けを見えないようにしたもの。
まるで、自分のPCにあるかのように見せて、実際に編集も加工も出来るけど
実際は自分のPCにはコピーされてないって事
73デフォルトの名無しさん:2006/05/06(土) 10:31:43
>>72
ポインタで渡した場合と、参照で渡した場合とでは出来ることに差があるのですか?
74デフォルトの名無しさん:2006/05/06(土) 10:52:49
>>73
差は無いよ。ポインタ渡しでも参照渡しでも出来る事は同じで、ただ記述法が違うだけ。
ポインタ渡しは参照だという事が判りやすいというだけだね。

しいて上げれば、
参照でもポインタでも、読んでもいいけど書いちゃダメだよという指令が出来るけど
参照は、読めないよ、返すだけに使ってねという指示が出来る点かな
75デフォルトの名無しさん:2006/05/06(土) 10:54:31
読めないよ、返すだけ、なんてできたっけ?
76デフォルトの名無しさん:2006/05/06(土) 10:57:48
ウソこき>>74
77デフォルトの名無しさん:2006/05/06(土) 11:02:27
const参照のこと言ってるのか?
78デフォルトの名無しさん:2006/05/06(土) 11:03:21
const 参照って、読むだけ!! じゃなかったっけ?
79デフォルトの名無しさん:2006/05/06(土) 11:06:57
>>75
out パラメータというのは
設定出来る言語もあるし出来ない言語もあるよ。

COMサポート容易な言語の多くは出来るね。
80デフォルトの名無しさん:2006/05/06(土) 11:12:29
>>74
了解。
ということは、基本的には>>61の言っていることでいいと?
参照渡しは実はポインタ渡しだけど、あたかも値渡しのように見せかけていると
理解していいのでしょうか?
81デフォルトの名無しさん:2006/05/06(土) 11:12:38
ポインタと参照渡しが出来て out が使えるのは delphiくらいかな
あC#も出来たか
82デフォルトの名無しさん:2006/05/06(土) 11:15:08
ところで、お前らは構造体の参照渡しを許せるか?
これじゃグローバル変数使うのと変わらんじゃん。
しかも、構造体にさらに構造体のポインタが含まれ、
その中にさらに構造体のポインタが含まれ、
その中にさらに・・・
なんていったらもう全変数渡してんのと変わらんね☆
渡したところで使うのはごく一部だろうが!!
83デフォルトの名無しさん:2006/05/06(土) 11:17:07
>>80 CPUの世界までは行き過ぎで賛同出来ないけど

>参照渡しは実はポインタ渡しだけど、あたかも値渡しのように見せかけている

という理解でいいと思うよ。

最近の言語は、オブジェクトを参照で保持するものが多いし
代入が参照の複製だったりするから、ほんと混乱するよね
84デフォルトの名無しさん:2006/05/06(土) 11:19:19
>>82
オブジェクト型なんて、まさにそれをやってるわけで
85デフォルトの名無しさん:2006/05/06(土) 11:23:43
>>83
サンクス。
やっと理解できました。
86デフォルトの名無しさん:2006/05/06(土) 11:51:26
C++ におけるポインタと参照の違い

参照 ポインタ演算ができない
ポインタ ポインタ演算ができる
※ポインタ演算が不要なら参照がお勧め

参照 アドレスの比較をするために & を使わなければならない
ポインタ そのまま比較できる
※NULL を渡したり返したりするならポインタがお勧め
87デフォルトの名無しさん:2006/05/06(土) 13:11:00
NULL渡すな。
optional使え。
88デフォルトの名無しさん:2006/05/06(土) 19:46:30
>>87
何気に参照型も受け付けるのは驚いた。
89デフォルトの名無しさん:2006/05/07(日) 14:19:33
世の中には、NULLを返せる参照もあるし、
ポインタ演算は、イテレータや参照の配列で
同じことやさらに高度なことが出来る。
90デフォルトの名無しさん:2006/05/07(日) 15:49:50
ポインタ渡し
┣2つ目以降の返値の代用(→boost::tupple)
┣配列(→各種iterator)
┣省略可能(→boost::optional)
┣渡したオブジェクトの状態を変化させる(→参照)
┗外部ライブラリから返ってくるハンドル(→ラップしる!)

という風に、C++ではポインタ同様にポインタ渡しも排除できると思う。
91デフォルトの名無しさん:2006/05/07(日) 17:21:49
この手のスレは参照をC/C++前提で話す人と
一般的な参照で話す人とで齟齬が生じるんだよな
92デフォルトの名無しさん:2006/05/07(日) 18:04:07
関係ないけど、こないだ読んだ本では、参照渡しも
結局はビットフィールドコピーしてるんだから値渡しだ!ってゆってた
93デフォルトの名無しさん:2006/05/07(日) 19:44:14
おおぅ何か香ばしいぜぇぇえええ
94デフォルトの名無しさん:2006/05/07(日) 19:45:07
それはアドレスがコピーされてるってことでしょ。
95デフォルトの名無しさん:2006/05/07(日) 20:25:02
結局、プログラムも、音楽も、映像もビットフィールドで出来ているんだから、
二進数だ!
96デフォルトの名無しさん:2006/05/07(日) 22:03:39
>>74
C++の参照渡しはコピーコンストラクタや演算子のオーバーロードのために存在する。
特に、コピーコンストラクタは参照渡しで定義しないと自動的に無限ループだからね。

個人的には、これら以外では参照渡しよりもポインタ渡しを推奨するなあ。
ソースを書いてるときはポインタ渡しの方がタイプ量が若干増えるけど、
後からソースを見たときに、実際に渡しているのが何なのかが
パッと見て区別できるのは結構大きい。

特に「ポインタ不要論」で紹介されている、データの返し先引数として
参照を使うってのは、俺的には最悪。
例えばf(a,b,c,d,e)の呼び出しだけ見てa・b・cは値を渡すだけで
d・eには値が帰ってくるかもしれない、なんてパッと見で分かる奴なぞ
だれもいないだろう。
ポインタにすれば、printf("%d",a)とscanf("%d",&a)の例のように
前者はaを書き換えない、後者はaを書き換える(かもしれない)ってのが
一目瞭然。
97デフォルトの名無しさん:2006/05/07(日) 22:49:21
>>96
その理屈だと、巨大なオブジェクトや構造体も値渡しということになってしまう。
かといって、ポインタ渡ししたくても書き換える可能性ありと思われてしまうことになる。

結論:適材適所。他人に公開する関数はI/Fの記述を忘れずに。
98デフォルトの名無しさん:2006/05/07(日) 22:54:22
俺はデータの返し先に参照を使うことに抵抗を感じないけどな。
std::string s;
std::getline(std::cin, s);
使ったときは大抵こういう風に直前に変数宣言があって、
明らかにgetlineの中でsに何か書かれるに違いないという感じになる。

それにそう何個も返したければ戻り値クラス・構造体にまとめるし。
99デフォルトの名無しさん:2006/05/07(日) 23:42:07
96じゃないけど、const参照渡しはありだとおも。
行き→&無し
帰り→&あり
で統一するなら。
まー漏れはtupple使うがなー
100デフォルトの名無しさん:2006/05/08(月) 11:49:31
>>96
>C++の参照渡しはコピーコンストラクタや演算子のオーバーロードのために存在する。
デタラメを吹聴しないように。

>ポインタにすれば、printf("%d",a)とscanf("%d",&a)の例のように
  char s[] = "1234";
  myfunc("%s", s);
*s を書き換えるかどうか、お前には想像がつくとでも?
それは、ポインタか参照か、という問題ではない。
ポインタ/参照を受け取る関数が、その内容を
書き換えるかどうかは、const として宣言されているか
どうかで判断するしかない。
101デフォルトの名無しさん:2006/05/08(月) 18:46:16
>>100
D&Eには「主に、演算子のオーバーロードをサポートするために導入した」と書かれている。
だからと言って俺はこれっぽっちもそれ以外の用途で非const参照を使うべきではないと思っていないけどね。
102デフォルトの名無しさん:2006/05/09(火) 16:01:15
>2は概念と実装がごっちゃだよ。

概念としては値渡しと参照渡ししかない。
(名前渡しはちょっと複雑な参照渡し)
実装としては値渡ししかない。
(スタックで渡すか固定アドレスで渡すかレジスタで渡すか等の違いはある)

Cのポインタ渡しはプログラマが、C++等の参照渡しはコンパイラが
値渡しを使って擬似的に参照渡しを行っているだけ。
103デフォルトの名無しさん:2006/05/09(火) 22:44:12
>>102最後の行は
概念と実装がごっちゃでないのか?
104102:2006/05/09(火) 23:12:30
>103
値渡しを用いて参照渡しを実装している、というべきだったかな。
105デフォルトの名無しさん:2006/05/10(水) 02:42:53
■値渡し func(i)
push dword ptr[ebp-04]
call func1
■参照渡し func2(i)
lea eax,[ebp-04]
push eax
call func2
■ポインタ渡し func3(&i)
lea eax,[ebp-04]
push eax
call func3
106デフォルトの名無しさん:2006/05/11(木) 14:11:04
>>105
お、参照とポインタ渡しはコンパイル結果が同じだね?
107デフォルトの名無しさん:2006/05/11(木) 18:22:03
■値渡し func(i)
push dword ptr[ebp-04]
call func1
■参照渡し func2(i)
lea eax,[ebp-04]
push eax
call func2
■ポインタ渡し func3(&i)
lea eax,[ebp-04]
push eax
call func3
■ポインタ渡し func4(i)
push dword ptr[ebp-04]
call func4
108デフォルトの名無しさん:2006/05/12(金) 09:06:52
同じようなソースでも
コンパイル後が違ったり同じだったりするところが
面白いというかイヤらしいというか。
109デフォルトの名無しさん:2006/05/12(金) 12:49:12
>>106
当たり前だろう。
110デフォルトの名無しさん:2006/05/12(金) 12:53:13
>>107
func2(i)とfunc3(&i)ってeaxに一度アドレス入れてるのって何か無駄じゃない?
111110:2006/05/12(金) 12:55:33
無駄じゃなかったww
112デフォルトの名無しさん:2006/05/12(金) 18:00:05
名前渡しは?
113デフォルトの名無しさん:2006/05/17(水) 10:51:16
名前渡しってC++で実装できなくもなさそうだよな。

template <class T> struct named_arg {
 virtual T operator() () = 0;

 named_plus<T> operator+ (const named_arg<T>& t1) {
  return named_plus<T>(*this, t1);
 }
//以下演算子をオーバーロードしまくり
};

template <class T> class named_plus : named_arg<T> {
 const named_arg<T>& _t1, _t2;
public:
 named_plus(const named_arg<T>& t1, const named_arg<T>& t2>)
  : _t1(t1), _t2(t2) {}
 T operator() () { return _t1() + _t2(); }
};

template <class T> class named_element : named_arg<T&> {
 T& _tref;
public:
 named_element(T& tref) : _tref(tref) {}
 T& operator() () { return _tref; }
};

…何に使うんだ?
114デフォルトの名無しさん:2006/05/18(木) 01:37:55
普通にマクロでいいじゃん
115デフォルトの名無しさん:2006/08/16(水) 01:03:55
C++の場合、全部参照にすべき(Javaがそうだからそろえる

test1(int& a){ //参照渡し
a = 1;
}
test2(int* a){ //ポインタ渡し
*a = 1;
}
test1(a);
test2(&a); //結果は同じだが、書き方が2種類でミスがでる

要はポインタ表記を絶滅させること。これでヌルポもなくなる。
あと文字列はstd::stringとかCStringでもいい
配列はvectorでnew、deleteもなくなってメモリリークもなくなる
116デフォルトの名無しさん:2006/08/16(水) 10:44:19
>>115
つまり、巨大な単体オブジェクトも常にローカルに配置しろと言うことですね?
或いはレガシーなAPIとのI/Fを捨てると言うことですね?
117デフォルトの名無しさん:2006/08/16(水) 12:49:23
>>115
本筋には賛成するが、Javaがそうだからというのは違和感を感じる。
C++の参照は後から参照先を変えられないが、Javaの参照ではできる。
その点ではポインタの方が近い。

>>116
どっちもラッピングすればいいと思う。

特に前者に関してはこういう話も。
http://d.hatena.ne.jp/Cryolite/20060622
118デフォルトの名無しさん:2006/08/24(木) 22:57:36
//やっぱ邪悪杉
int procA()
{
    printf("Hello World!\n");
    return 0;
}

int main(int argc, char* argv[])
{
    int (*funcptr)()=procA;

    (*&*&*&****&**&*******&*&*&*&***&***&***&**&***&**&***&*&**procA)();
    (*&*&*&****&**&*****&*&***&*&**procA)();

    return 0;
}



119デフォルトの名無しさん:2006/08/24(木) 22:58:42
間違えた
int procA()
{
printf("Hello World!\n");
return 0;
}

int main(int argc, char* argv[])
{
int (*funcptr)()=procA;

(*&*&*&****&**&*****&*&***&*&**funcptr)();
(*&*&*&****&**&*******&*&*&*&***&***&***&**&***&**&***&*&**procA)();

return 0;
}

120デフォルトの名無しさん:2006/08/28(月) 17:23:46
ヌルポが出ること事態ヘタレの象徴だと思ってる俺がいる
121デフォルトの名無しさん:2006/09/05(火) 05:07:28
>>119
昔まじめに

int********** GetHoge();

みたいな関数見たことあるよw
一瞬何の言語かと思った
122デフォルトの名無しさん:2006/09/05(火) 23:55:56
>>121
ま、糞だな
123デフォルトの名無しさん:2006/09/16(土) 19:50:31
多次元の配列だろうな。
124デフォルトの名無しさん:2006/09/25(月) 09:41:03
何次元だよwwww
メモリ足りんのか?
125デフォルトの名無しさん:2006/10/29(日) 23:05:24
ttp://homepage3.nifty.com/mogami/diary/d0610.html#26t1
> ...
> だからユーザからはポインタの自由を取り上げるべきだ。
126デフォルトの名無しさん:2006/10/30(月) 00:48:06
>>125
ユーザーにはプログラム自体見せるなよw
127デフォルトの名無しさん:2006/10/30(月) 00:58:13
「プログラミング言語のユーザ」という意味だと思われ
128デフォルトの名無しさん:2006/10/30(月) 08:55:25
>>125
その言語のページは無いの? ひどく検索しづらいんだけど。
129デフォルトの名無しさん:2006/10/30(月) 09:09:13
プログラミング言語 Cipher
ttp://homepage3.nifty.com/mogami/lang/index.html
130デフォルトの名無しさん:2006/10/31(火) 01:58:26
ありがと
面白そうかも
131デフォルトの名無しさん:2006/11/26(日) 16:10:22
どうでもいいが、C++を前提にすれば参照はインライン展開される際ポインタと違って
演算される可能性が無いので処理系によってはマクロ展開のように呼び出しもとの変数
そのものに差し替えられる可能性がある。また、ポインタの場合は演算される可能性が
あるので大抵一時変数が確保される。尤も、参照渡しの最たる所はテンプレートで既存
の型と演算子をオーバーロードされたクラスが同居できる点にあるが…。
132デフォルトの名無しさん:2006/11/26(日) 16:41:52
>>131
今時のコンパイラはインライン展開できる状況ならポインタでもconst修飾されていれば参照と同じようなコードになるよ。
133デフォルトの名無しさん
Cのポインタは難しいといわれてきたが、概念的には気楽だと思う。
所詮は相対アドレスだし、デバッガも充実してるからね。
自分にはperlやJavaScriptのほうがヤダ。
特にデバッガを通すと挙動が変わるperlには殺意を覚える。