「オーバーロード」の版間の差分
提供: C++入門
(相違点なし)
|
2015年4月25日 (土) 17:35時点における最新版
オーバーロード(overload) とは、C++でポリモーフィズムを実現する機能です。
読み方
- オーバーロード
概要
C言語では、引数の型事に別名の関数を用意していましたが、C++の場合は、引数の型が違う関数を同名で多重定義(オーバーロード)することが可能です。 C言語の場合は、以下の様な定義をしていました。
int hogeInt(int i) { return i; } int hogeDouble(double d) { return d; }
C++のオーバーロードを利用すると同一関数名で多重定義できます。
int hoge(int i) { return i; } int hoge(double d) { return d; }
演算子のオーバーロード
演算子のオーバーロードには、operatorキーワードを使用します。 演算子というのは、例えば、以下のものです。
- <<演算子(シフト演算子)
- >>演算子(シフト演算子)
- +演算子(演算子)
- -演算子(演算子)
- ++演算子(単項演算子)
- --演算子(単項演算子)
型 operator オペレータシンボル(引数リスト)
演算子のオーバーロードにより、独自クラス同士を足しあわせたり、std::coutに<<演算子で流し込んだりすることが可能になります。
+演算子のオーバーロード
+演算子のオーバーロードで、独自クラスを足し合わせる例です。
/* * operator_plus.cpp * Copyright (C) 2015 kaoru <kaoru@localhost> */ #include <iostream> using namespace std; class Int { int i; public: int operator+(Int obj) { return this->i + obj.i; } Int(int x): i(x) {} }; int main(int argc, char const* argv[]) { Int o1(1), o2(2); cout << o1 + o2 << endl; // 1+2 = 3 return 0; }
++演算子のオーバーロード
独自クラスの後置インクリメントと前置インクリメントの例です。
/* * operator_plus.cpp * Copyright (C) 2015 kaoru <kaoru@localhost> */ #include <iostream> using namespace std; class Point { int i; int j; public: // 後置インクリメント void operator ++(int n) { cout << __PRETTY_FUNCTION__ << endl; i++; j++; } // 前置インクリメント Point operator ++() { cout << __PRETTY_FUNCTION__ << endl; ++i; ++j; return *this; } Point(int x, int y): i(x), j(y) {} }; int main(int argc, char const* argv[]) { Point o1(1, 1); o1++; ++o1; return 0; }
<<演算子のオーバーロード
この例では、<<演算子をオーバーロードして、独自クラスのデータを画面に表示できます。
/* * operator_left_shift_shift.cpp * Copyright (C) 2015 kaoru <kaoru@localhost> */ #include <iostream> using namespace std; class Data { int i, j; public: Data(int x, int y) : i(x), j(y) { } friend ostream& operator<<(ostream& os, const Data &d); }; ostream& operator<<(ostream& os, const Data &d) { os << d.i << " " << d.j; return os; } int main(int argc, char const* argv[]) { Data d(1,2); cout << d << endl; // 出力: 1 2 return 0; }