作者: 機械伯爵
日時: 2002/3/25(10:49)
 ども、機械です。

> # オーバーロードと再定義って何か違う気もするのですが、

 一応、そこらへんの本に載ってる訳語をあてましたが、多重
定義の方が正しいかもしれませんね。

※再定義はオーバーライドかな?

> 確かに Python とか Ruby とかでは演算子の
> 再定義(多重定義?)が簡単に使えますね。

 Rubyで簡単に出来るというのは初耳だったので、Ruby教典を
調べてみました。

 う〜ん、Rubyでは、たとえば・・・

 A + B

 を定義しようとすると、かならずBの側で定義する必要があるよ
うですね。

 よって、Bが組み込みオブジェクトだと面倒らしく、そのために
特殊なルールがあるみたいですね。

 Pythonでは、演算子のフックメソッドがどちらでも定義できます
ので、文法的には泥臭いですが、非常に単純です。

> 恥ずかしながら、C++ だと良く分からなくなって
> しまうのですが…。(^^;

 実はC++でも、プライベートフィールドをいじるのでなければ、
そんなに難しくありません。

 関数と同じように・・・

返り値型 operator演算子(適用型)

 で定義できます。

 具体的には、class Aとclass Bの間で、+を使い、結果をA型であらわしたい
なら・・・

A operator+(A,B)

 で定義します。

 Rubyと異なり、C++は独立した関数が定義できます(つまり、完全なオブジェクト
指向言語ではない)ので、考え方としてはRubyよりシンプルです。

 問題は、どの教科書も、インスタンスフィールドは基本的にプライベートであり
外からアクセスするには、フレンド関数として定義しておかなければならない、な
んて話がくっつくので、一気にややこしくなるだけです。

 分厚いですが、C++教典(ストラウストラップ著「プログラミング言語C++」)を
見ると、非常にすっきりします。

※ちなみに、Cの構造体のキーワードstractは、C++では非常に自由度の高いクラス
 (classキーワードで使える機能は全てあります)として使えるので、Pythonの
 ような抽象データの延長としてのクラスを使いたい場合は、classキーワードの
 かわりにこちらを使うと面白いです。
 
> 演算子の再定義(多重定義?)に関しては、
> 1. C++ だとなぜ良く分からなくなってしまうのか?

 私は、今言いました通り、プライベートフィールドへのアクセスの話がセットで
でてくるので、必要以上にややこしくなってるんじゃないか、と思ってます。

 断言しますが、演算子のオーバーロードについては、本来、Rubyより簡単です。

 理由は、次にからめます。

> 2. なぜ演算子を人は好むのか?

 プログラムを数学的に見るか、あるいは言語としてみるかという一つの流れ
があるような気がします。

 Fortranに始まって、AlgolからCへの流れは、基本的には数学的です。

 ですから、数学的な演算子は、どうしても使いたいと思うでしょう。

 ひるがえってSmalltalkあたりから出てくるオブジェクト指向言語は、どち
らかといえば言語的です。

 Smalltalkにはそも、演算子の優先順位さえないですし、2項演算子も、
なんかやむをえず入れたような雰囲気があります。

 ですから、完全なオブジェクト指向言語には、あまり演算子はなじまないよう
なきがします。

 なぜなら、演算子はその名の通り「Operator(操作するもの)」であり、
オブジェクトの振る舞いはオブジェクト自身が知っていて自発的に働く、と
いう、オブジェクト指向主義の大原則とはあまり相性が良いとは思えません。

 Pythonのように、クラスの中に外を展開して(笑)行う、エセオブジェクト
指向ならともかく、Rubyのような純粋培養オブジェクト指向言語が、演算子
のような粗野なものを扱うのは、ある程度制限や特例が必要になるのでしょう。

※まぁ、数学的でも言語的でもないLispのようなものもあるますので、上は
 大雑把に考えてください。

※どうでもいいですけど、Rubyの文法は、C++よりはるかに難しいと思うのは
 私だけでしょうか・・・Rubyのほうが、C++よりはるかにコーディングが楽
 だ、というのには異論がありませんが、Rubyの文法にはあまりにも特例が
 多すぎて、未だに概観がつかめていません・・・話すのは割と簡単だけど、
 文法がとらえがたいフランス語的なRuby(Effelの影も見えるし☆)と、文法
 は一貫性があって理解しやすいが、とかくその厳格な文法にしばられて話に
 くいドイツ語的なC++・・・とか?(笑)ちなみに、私は第二外国語は
 ドイツ語をとりました(完璧に忘れましたが・・・)