- 1 名前:前々スレ985 mailto:sage [03/12/18 06:52]
- 理解できないわけないだろ!
デザパタも知らずにC++使いの質を下げるC厨には げんあり 前スレ達 難易度:1 pc2.2ch.net/tech/kako/1058/10586/1058675178.html 難易度:2 1pc2.2ch.net/test/read.cgi/tech/1063323615/
- 910 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 03:52:27 ]
- 当時のコンピュータとコンパイラの性能とあわせて
コスト的に違うものだという意識が働いてたんじゃないのかね。 a = aa.bb.cc.dd と a = aa->bb->cc->dd じゃ 生成されるコードが全然違うからね。 と思ったが、配列とポインタの扱いを考えると違うか。 a->bが(*a).bという記法の省略であるというのはどこでも説明されているけど。
- 911 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 09:06:35 ]
- つーかメンバのポインタだけ -> なんて記号使っておきながら
なんで他のポインタはアスタリスクだらけなんだろうか
- 912 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:59:15 ]
- >>910
古い本には「ポインタを何回たぐる」といった表現が頻繁に出てきて、 間接アドレッシングのコストが強く意識されていた様子が読み取れる。 だから.と->でのコストの違いは大きな要因だったと思うよ。 ましてstructやunionは入れ子にしてaa.bb.cc.ddみたいに アクセスするのが前提っぽい設計だし。
- 913 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 09:26:47 ]
- Cの基本は値渡し。
構造体と配列は値渡しができないのでポインタ渡し。 そこで、構造体と配列については簡易にアクセスできる演算子を作った。 とか言ってみる。
- 914 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 10:48:42 ]
- >構造体と配列は値渡しができないのでポインタ渡し。
???
- 915 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:09:45 ]
- >>914
配列は値渡しできないだろ。 K&R時代は構造体も値渡しできなかったよ。
- 916 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:56:14 ]
- いや、配列はわかってるよ。構造体もできない時代があったのか・・・失礼。
VBでbyvalで渡せなくて「なんだこの糞言語は!」って思ったこともあったなぁ・・・
- 917 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 19:00:56 ]
- 正確には「配列の先頭アドレスを値渡し」だな
配列の中身は参照渡しに見えるけどな
- 918 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:07:31 ]
- むしろ、Cは全てにおいて値を渡す
その値は変数の中身だったり(変数や配列を参照する)アドレスだったりする と考えるのが正確ではないか
- 919 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 09:34:06 ]
- >>918
その程度のことをもっともらしく語るなw 構造体、配列はその中身を渡したくても渡せなかった。 本当は中身を渡したくても、不本意ながらアドレスを渡すしかなかった。 だから[]や->を作ったと言うことでしょ。
- 920 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 09:52:05 ]
- その意味では、「全てにおいて値を渡す」ってのは低レベルの言語では極当たり前の話だよね。
プロセッサにおいて、何がしかの値以外のものを渡すって概念がないんだから。
- 921 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:53:43 ]
- でもこの基本中の基本が理解できなくて、
ポインタを覚えようとしている初心者は発狂する 解説書が悪いんだが
- 922 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:03:44 ]
- typedef class foo{
..... }bar; bar *ptr; ptr=new bar(); (*ptr).some_member=1; (*ptr).some_methode(); とかしても、正常にコンパイル出来て走るのに 型宣言の時 ptr -> bar; という書式で宣言できないのは、もしかするとちょっと問題かも知れませんね。型 変数という宣言時の並びを遵守してないという文句は <-も 認めて bar <- ptr; というようにするわけです。 そうすれば、ポインタは2通りの表記法(* ->)が使えるということに なって表記上の柔軟性が増加するわけです。*表現は算術演算の*と まぎわらしい場合があって多用されるとウザい場合が確かにありますね。
- 923 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:12:58 ]
- >>922
->の意味わかってる?w
- 924 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:32:29 ]
- 昔、Cマガだったか、operator < とoperator -を定義してop<-methodを実装するよーな
話があったような・・・
- 925 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:33:07 ]
- =>と->があって+>が無いのはおかしい
と一瞬思ったがそもそも=>なんて無かった
- 926 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:37:30 ]
- op>-.-<qo;
- 927 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:38:23 ]
- ・(中黒)やx(エックス)ってオペラントにはならんよな
内積と外積をですね。あと|A|とか
- 928 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:39:20 ]
- そもそも中黒はASCIIに無いだろ
- 929 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 01:39:56 ]
- C/C++で使われない記号ってある?
キーボードをざっと見渡して$と@はソース上には出てこないかなと思ったけど・・・
- 930 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 01:50:14 ]
- ->
=|> ===||> だんだん貫通力が上がっていくぞ!
- 931 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:00:33 ]
- >>929
@は使う
- 932 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:02:06 ]
- $もつかえるよ
- 933 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 06:32:21 ]
- >>929
「`」はない
- 934 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:15:53 ]
- >>894
ポリモーフィズムが実行されるために、オーバーライドする関数にはvirtualをつけるべき オブジェクトスライシングが起こるからスーパークラスの変数にサブクラスの変数を入れないようにすべき 例外を投げる時はポインタではなく値で投げるべき、受ける時はオブジェクトスライシングしないように参照で受けるべき メソッドの実引数の値を変更したくない時で、組み込み型の場合は値渡しで、そうでない場合はconstリファレンスで定義すべき、 メソッドの実引数の値をメソッド内部で変更したい時で、組み込み型の場合はリファレンスで、そうでない場合はアドレス渡しで定義すべき… 意識的にそうしないという選択ができるという利点はあるのかもしれないけど… こういうことに気を使いながら、処理内容の方に注意の力点を置いて実装…自分にはムリだ('A`)
- 935 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:47:53 ]
- >>934
>メソッドの実引数の値をメソッド内部で変更したい時で、組み込み型の場合はリファレンスで、そうでない場合はアドレス渡しで定義すべき… 逆じゃないのか?
- 936 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:16:28 ]
- >>935
逆でした('A`)
- 937 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:20:14 ]
- C++の参照渡しキモ杉
- 938 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:21:55 ]
- >>935-936
その区別、意味あんの? 呼び出し元のオブジェクトいじってほしいときは全部参照渡しでよくね?
- 939 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:39:59 ]
- > ポリモーフィズムが実行されるために、オーバーライドする関数にはvirtualをつけるべき
C#もそうじゃない。Javaはそうじゃないけど。 > オブジェクトスライシングが起こるからスーパークラスの変数にサブクラスの変数を入れないようにすべき 基底クラスのコピーコンストラクタ・代入演算子はprivateにしろ。 これはこれで意識しないといけないことだけどさ。 >例外を投げる時はポインタではなく値で投げるべき、受ける時はオブジェクトスライシングしないように参照で受けるべき 受けるほうはともかく、投げるほうに意識する必要あるか?
- 940 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 14:01:07 ]
- ポインタで例外を投げるってのは、
throw new Exception(hoge) って事だから
- 941 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:01:24 ]
- うん。何も考えなかったら、throw Exceptionって書くだろ。
Java/C#のくせでついうっかりってならともかく。
- 942 名前:934 mailto:sage [2008/03/15(土) 22:02:44 ]
- 元ネタは詳説C++です。
>>938 まず、コスト的にはリファレンスでもポインタでもそれほど変わらないということがあって、 組み込み型の場合、メソッド内で変更可の場合は引数をポインタとすることで、 変更不可の場合の呼び出し f(a) 変更可の場合の呼び出し f(&a) となり、呼び出している箇所を見ることでf()が引数の内容を変更するかどうかのヒントを得ることができる というのがその理由です。まあ好みの問題かもしれません。 後関係ないけれどNULLを渡す可能性がある場合はリファレンスではなくポインタにしなければならない…ってのも考慮しなきゃいけないですね… >>939 コピーコンストラクタを作るのが面倒で、じゃあポインタ渡しすればいいじゃんと思ったりとか…? 自分はJava一辺倒なので、C++のプロジェクトに放り込まれたら慣れるまでは落とし穴にはまりまくりそうです。慣れてもどれか1つ忘れてポカしそう… C++でバリバリコード書きまくるというのには憧れるんですが…。
- 943 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:50:44 ]
- >>942
コピーコンストラクタを設けるかどうかは、どちらかというと設計の問題。 一般的に継承してポリモーフィックに扱うクラスはコピー不可とすることが多い。 あった、ちょうどこういう話。 www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/ Clonableにするかどうかというのが近いといえば近いのかな。 Javaはあまりやったことないけど。
- 944 名前:デフォルトの名無しさん [2008/04/03(木) 18:43:11 ]
- 顧客より保身のほうが大事なヤツなんていねーよ
馬鹿じゃねーのwwww
- 945 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 20:16:55 ]
- この世に馬鹿がいることがわかってるなら、「いねー」なんて口が裂けても言えないはずだが。
- 946 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 22:02:23 ]
- >>945
ヒント:嫌味
- 947 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 22:06:03 ]
- 社会保険事務所とかに行くとそんな感じの人が一杯いるよ! ><
|

|