- 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/
- 894 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:44:52 ]
- 言語の細かいとこにあまり神経使いたくないね。
設計とかテストとか神経を使う重要なとこは他に一杯あるんだから。 重要でないが細かいとこに注意を向けるあまり肝心のことが抜けてるってのは ありすぎるほどある。 思い当たるだろ。 たぶん、個人の注意力の総量は一定なんだろう。 あるとこに注意を向ければ別のとこがおろそかになる。 それだったら重要度の高い部分に優先的に注意を向けたほうがいい。 しかし C++ だとこれが出来にくい。 言語に落とし穴が多いからいやでも注意しなければならない。
- 895 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:16:27 ]
- >>894
抽象的過ぎてわからん
- 896 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:34:24 ]
- >>894
落とし穴というのは適切な比喩でないな。道路脇の崖とでもいうべき。 道に慣れてる人間にとっては危険でもなんでもない。
- 897 名前:デフォルトの名無しさん [2008/03/09(日) 00:24:54 ]
- 初心者的な疑問なんだけど、
クラスとかからメンバを呼び出すときに .を使ったり->を使ったりするのって、具体的にどんな理由で2種類あるんでしょうか? ->を使うところをすべて.で済ますようなことをすると、ソース的にありえないところが出てきたりするのですか?
- 898 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:43:26 ]
- class foo {public: void memFunc();}があるとして、foo * bar = new fooしたときに
bar->memFunc()する代わりに(*bar).memFunc()することに何の躊躇いもないならば、 どうぞご自由にアロー演算子を使うことをおやめくださいませ。
- 899 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:45:08 ]
- struct A foo;
foo.val1 = 1; strct B * bar; bar->val2 = 2; // 初期化していないポインタへの演算ざけどそこらへんは気にせずに・・・
- 900 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 01:41:50 ]
- >>897
ポインタかそうでないか
- 901 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 01:59:41 ]
- そうじゃなくて、なぜ実体/参照は.で、ポインタは->なのか、ポインタにも.でアクセスできる文法にしなかった理由は何なのか、ということじゃないかな。
- 902 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:13:02 ]
- それはつまり
class Foo = new Foo(); という文法を認めろ、ということか・・・
- 903 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:14:40 ]
- 何書いてんだ俺w酔っ払いすぎだwww
foo f = new foo(); という文法を認めろ、ということか・・・ に訂正_| ̄|○
- 904 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:19:06 ]
- T1 p;のとき *p がT2&を返すような実装をしてると
p.aの意味が不明になるでわかるかな
- 905 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:23:12 ]
- >>904
演算子オーバーロードできるC++で破綻するのはわかるんだけど、.演算子と->演算子はCからあるよね。
- 906 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:29:07 ]
- Dでは左辺がポインタでもそうでなくても常に . 択一だったはず。
文法上はそれでも成り立つのはわかる。 でもなんでCでは区別するのかという答えは出てこないけどな。
- 907 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:47:07 ]
- 演算子をそう定義したから、としか言えないのかな。
ドット演算子はポインタでない変数のメンバを参照するもの、という定義があって、 これをポインタ変数に適用しようとすると、dereference operatorの機能も入るから、 演算子を同一としてはいけない、と。 ドット演算子を「変数のメンバを参照するもの」と定義すれば、ポインタでもそれ以外でも 使えるようになるけど、Cではそれをしなかった。 そう考えるとC++のoperator overloadingって結構変態的な機能なんだね。
- 908 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:57:33 ]
- そうだなCでだと、p.a.a と p.a の区別をどうするか
って言えばわかるかな
- 909 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 03:08:14 ]
- あんまり自信ないけど
要は誤って別の型にキャスト->ウヒャ を嫌ったんじゃないかと言う気がする
- 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 ]
- 社会保険事務所とかに行くとそんな感じの人が一杯いるよ! ><
|

|