作者: 機械伯爵
日時: 2002/3/28(00:08)
 ども、機械です。

 う〜ん、自分の不勉強が次第に暴露されていくのは、もはや
快感に近いですね☆

> > >  それよりも、もっと面倒なのは暗黙の型変換のせいじゃないでしょうか?
> >  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がオブジェクト指向言語だと思いましたが、
どんな言語か、詳しくは知りません・・・)

   機械伯爵