関数やコンストラクタのオーバーロード

C言語では、絶対値を計算する際、int、long、floatに対して各々の関数abs,labs,fabsを用意していました。この場合、関数の名前が複雑になります。この問題を解決するのが、関数のオーバーロードです。オーバーロードを使用するとabsだけで様々な型に対応することが可能となります。

様々な型に対応した足し算関数

簡単な例として、int、float、doubleに対応した足し算関数waを作ってみましょう。

#include <iostream>
using namespace std;

int wa(int i,int j){
    cout << "int" <<endl;
    return i+j;
}

float wa(float i,float j){
    cout << "float" <<endl;
    return i+j;
}

double wa(double i,double j){
    cout << "duble" <<endl;
    return i+j;
}

int main(void){
    int i=10, j=20;
	int k=wa(i,j);
	cout << k << endl;
    return 0;
}
int
30

このプログラムでは、int、float、doubleに対応した関数

  • int wa(int i,int j)
  • float wa(float i,float j)
  • double wa(double i,double j)

を用意してあります。名前はwaと同じですが、引数や戻り値が異なります。そのため、引数がintならint waが選ばれ、doubleならdouble waが関数として選ばれます。これが関数のオーバーロードと呼ばれる仕組みです。

コンストラクタのオーバーロード

関数と同様にコンストラクタもオーバーロードできます。引数に応じて適切なコンストラクタが選択されます。

#include <iostream>
using namespace std;

class A{
    int i;
public:
    A(){i=0;}
	A(int j){i=j;}
	int get(){return i;}
};

int main(void){
    A a(1);
	cout << a.get() << endl;
    return 0;
}
1

この場合は引数が1なので、コンストラクタA(int j)が呼ばれ、iが1となります。

著者:安井 真人(やすい まさと)