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); }※動作未確認のメモ書き。
このような重複する処理だが、型が異なるだけで別名の関数は作りたくない。要するに渡す型が異なれば同名関数名の多重定義が可能で、更にテンプレートと異なり処理内容も調整可能である。
▲上へ [ 編集 ]
リンク
内部リンク
- C/C++ C++/CLI C# 関連
- VC++ 2005 Express のインストール
- C/C++ の簡単なプログラム例
- C/C++ ソート(並べ替え)
- C/C++ テストの実行
- C/C++ テンプレート
- C/C++ オーバーロード
- C/C++ STL(Standard Template Library)
- 変数・定数
- プログラムの分割/ダイナミックリンクライブラリ など
- その他
- C/C++ その他::書式文字/ESC code など
- VB2005リファレンス(覚え書き)
- SQL文:SQLステートメント
- VBA(VisualBasic for Applications)
外部リンク
- 現在ありません
▲上へ [ 編集 ]
2008年07月15日(火) 05:33:07 Modified by cafeboy1