最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

C/C++ オーバーロード


C++ のオーバーロード

 C言語には、オーバーロードは無い。(テンプレートも同じ書き出し...)

 C++ のオーバーロード(overload)には「関数のオーバーロード(関数の多重定義)」と「演算子のオーバーロード(operator overloading)」の2種類がある。「関数のオーバーロード」は案外判りやすいが「演算子のオーバーロード」が難解な感あり。

 ここでは、主に「演算子のオーバーロード」を詳しく取りまとめてみたいと思う。

演算子の再定義例

 クラス が若干判ったところで演算子オーバーロードの実例。
 演算子のオーバーロードは C/C++ 演算子のオーバーロード 頁へ移動しました。

演算子のオーバーロード(再定義)とは?

 一般に operator[] などと表現されることが多い。

 例えば object_A + object_B の計算法則を再定義することが出来る。もし、object が構造体やクラスの場合、単に演算子を指定しても何をすればよいかコンパイラは判らない。

class Objects {
   string name;
   int    result;
} A, B;

 ・・・があり A + B と指示があれば、人はおそらく A.result + B.result と判断するが、PC は勝手にそんな判断はしないのである。それに構わずコンパイルすればエラーが出る。

  「ならば、そのように定義してしまえ!」というのが、演算子のオーバーロードになる。

int operator + (object& obj) {
   int ret;
   ret = this->result + obj->result;
   return ret;
}

 書き方が特殊だが、+ 周りの型が一致する場合、引数を自動判別し関数として呼び出される。

具体的な修正ソース
#include <iostream>
#include <string>
using namespace std;
class Objects {
   string name;
   int    result;
public:
   // コンストラクタ
   Objects(string in_name, int in_result) {
      this->result = in_result;
   }
   // オペレータ +(プラス) の再定義
   int operator + (Objects obj) {
      int ret = this->result + obj.result;
      return ret;
   }
};
void main() {
   Objects A("sakura", 68);
   Objects B("tomoyo", 93);
   cout << A + B << endl;     // 161
}

 ・・・ これで ・・・ A + B の実行は、暗黙で A.result + B.result を返すといった決め事が定義される。

※概念的な覚え書き(->動作チェック済み)。クラスでなく構造体でも可能らしい。

オーバーロード可能な演算子
(四則演算): + - * / % =
(代入): += -= *= /= %= ++ --
(比較): ! < > == != <= >= && ||
(bit演算): & | ^= &= |= << >> >>= <<=
(メモリ操作関連): [] new delete & * -> ->*
(その他): () \ , ※関数 () カンマ
※+ を - へ、* を / など、本来異なる動作を割当てることでもほぼ可能となる。


▲上へ [ 編集 ]

関数のオーバーロード(function overloading)

 一応、簡単に触れておく。オーバーロードとは異なるが、似たような感じで「[[関数テンプレート>C/C++ テンプレート}}」もある。」

関数の多重定義例

 オーバーロードと言っても、初めはピンとこないが「(関数名の)多重定義」なら何となく想像できると思う。

sample
int fn_add(int x,    int y)    { return x * y; }
int fn_add(double x, double y) { return (int)(x * y); }
※動作未確認のメモ書き。

 このような重複する処理だが、型が異なるだけで別名の関数は作りたくない。要するに渡す型が異なれば同名関数名の多重定義が可能で、更にテンプレートと異なり処理内容も調整可能である。

▲上へ [ 編集 ]

リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ [ 編集 ]
2008年07月15日(火) 05:33:07 Modified by cafeboy1




スマートフォン版で見る