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