ども、機械です。
う〜ん、自分の不勉強が次第に暴露されていくのは、もはや
快感に近いですね☆
> > > それよりも、もっと面倒なのは暗黙の型変換のせいじゃないでしょうか?
> > C++はクラスインスタンスについては非常にシビアなので、明示的なキャスト
> > がなければスーパークラス型にさえなりません。
↑は本当なんですが、そういえば、暗示的な型キャストが問題になるのは、関数
でなくて演算子でしたね・・・
<式>
> みたいなのがコンパイルできるはずです。Foo + Foo は定義してあって、
> Foo + int は定義していないのですが、Foo(int) のコンストラクタが
> あると、暗黙の型変換が起きます。
確認しました。
この場合、Foo + intは、Foo + Foo(int)となって、(この場合は)Foo型
の値が返り値となるようですね。
ストラウストラップ先生は「演算子の組み合わせが指数関数的に増えて、
その定義の手間によるわずらわしさとミスを防ぐため(意訳)」と申されてい
るようですが、若干わかりにくかもしれませんね。
整数→実数(浮動小数点数)→複素数という型キャストと同様の感覚で理解
できないことはないわけですし、演算に使う以上、数値的なオブジェクトである
と思われるわけなので、思想としては一貫してるため、曖昧さは無いと思い
ますが、まぁ・・・あまり「簡便」だとは思えなくなりました、ハイ。
> 古くからC++に触れた人はこのあたりの混乱に嫌気がさしているでしょうし、
> 新しい仕様にちゃんとマッチした参考書(とくに、古い仕様と新しい
> 仕様の差分をきちんと記述したもの)の不足もあって、C++の
> 演算子オーバーロードはややこしい、という定説があるんじゃないかと
> 思います。
私も、1998年(1997年)以前のC++の本は、正直、読む気ありませんでした
からね・・・(何回も挫折しました・・・)
WindowsなんかでVC++を使えないのも、新ISO-C++規格でない、というのが
ありまして・・・
※DelphiのObjectPascalはヒステリックな仕様の言語なんで、C++Builder
に鞍替えしよーかしらん。
> 新しいC++の話としては、先月のCマガジンをみていて、explicit
> キーワードというのがあるそうで、これをつかうと暗黙の型変換を
> 抑止できるそうです。
先月のCマガ、買いそびれたんですよねぇ(毎月買ってるんですが・・・)
私の感想としては、explicit(明示的)というようなキーワードを作る
くらいなら、implicit(暗黙の)というキーワードを作って、「融通」する
ほうを規制したほうが間違いが少ないんじゃないかな、と思います。
> 例えばの話ですが、Complex + Int と Int + Complex は同じ結果に
> なることを期待しますよね。ですが、純粋オブジェクト指向に従えば、
> 前者は Complex クラスのメソッド、後者は Int クラスのメソッドに
> なります。これの実装が食い違っていることがややこしさの原因に
> なっている場合があるんじゃないかと思ったのです。
複数のオブジェクトに一気にメッセージを送るシステムがあれば面白そう
ですけどね。
そうなると、Forthのように後置式(RPN)にしたほうがいいみたいですね。
(確かForthの亜種のMopsがオブジェクト指向言語だと思いましたが、
どんな言語か、詳しくは知りません・・・)
機械伯爵