April 30, 2004

鶏が先だと思われ

C++には演算子のオーバーロードという便利な機能があって、+(プラス)や-(マイナス)なども関数として定義することが可能な言語仕様になっています。この前の行列ライブラリ作成の際もこの機能にはお世話になりました。

で、ふと思ったことなのですが、自己改変をするメソッド(例えば+=とか)と、自己改変をしないメソッド(例えば+とか)、どちらの定義が本質的なのでしょうか。
考えてみた結果、前者の定義、すなわち自己改変をするメソッドの定義の方が先にあったほうが都合がよい、つまり本質的ではないかと思います。

以下の例を見てください。この例はメンバ変数がポインタであり、代入演算子やコピーコンストラクタではデフォルトの動作でシャローコピー(アドレスのコピー)しか行われません。

template<class T>
class Hoge{
    private:
        T *member;
    public:
        Hoge(T ada){member = new T(ada);}
        ~Hoge(){delete member;}

        Hoge copy(){
            Hoge deep_copy(*member);
            return deep_copy;
        }

        Hoge &operator+=(const Hoge &hoge){    //自己改変するメソッド
            (*member) += *(hoge.member);
            return *this;
        }
        Hoge operator+(const Hoge &hoge) const{    //自己改変しないメソッド
            return (copy() += hoge);
        }
};


自己改変するメソッドを先に定義することによって自己改変しないメソッドの定義が簡単にできます。

オブジェクト指向というのは、デフォルトの操作がオブジェクトを増やさない方向にあることもあわせて考えれば、自己改変をすることこそ、メソッドの定義として本質的なのでは。

19:43 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/248
コメント

はい、まさしくそのとおり。
(半端な)OOを効率よく実装するための言語がC++。なので、自己破壊的メソッドをまず先に定義してから、それを利用して非破壊的メソッドを実装するというのが定石です。非破壊的メソッドなら新たにオブジェクト生成せにゃならん分コストがかかるからね。
Stroustrupの著書とかよく読んでみましょう;-)

Posted by: shig : May 1, 2004 07:49 AM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。