「オーバーロード」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「オーバーロード(overload) とは、C++でポリモーフィズムを実現する機能です。 '''読み方''' ;オーバーロード: __TOC__ == 概要...」)
 
(相違点なし)

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;
}

関連項目