C++のオーバーロードのサンプルです。
目次
サンプル | オーバーロード |
関数のオーバーロード | |
クラスのメンバ関数のオーバーロード | |
クラスのコンストラクタのオーバーロード |
オーバーロード
- 関数名またはクラスのメンバ関数名またはコンストラクタ名が同じで引数の型や数が異なるものです。
- 渡す引数によって自動的に引数にあった関数またはメンバ関数またはコンストラクタが実行されます。
- メソッド名、引数の型、引数の数の組み合わせをシグネチャ(signature)と呼びます。
→メソッド名ではなくシグネチャで判別されます。 - 継承の機能で、似た名前のオーバーライドがありますがそれとは別です。オーバーロードと継承は関係ありません。
関数のオーバーロード
#include <iostream>
using namespace std;
int calc(int a1, int a2) // 関数
{
return a1 + a2;
}
int calc(int a1, int a2, int a3) // 関数
{
return a1 + a2 + a3;
}
int main()
{
int num1 = calc(1, 2);
cout << "the answer is " << num1 << ".\n"; //the answer is 3.
int num2 = calc(1, 2, 3);
cout << "the answer is " << num2 << ".\n"; //the answer is 6.
return 0;
}
4,8行目は、同じ関数名(calc)です。違いは引数の数が異なっています。
15行目は、引数が2つです。4行目の関数が実行されます。
18行目は、引数が3つです。8行目の関数が実行されます。
クラスのメンバ関数のオーバーロード
#include <iostream>
using namespace std;
class Color
{
public:
void print1(string str1) // メンバ関数
{
cout << str1 << "\n";
};
public:
void print1(string str1, string str2) // メンバ関数
{
cout << str1 << " and " << str2 << "\n";
};
};
int main()
{
Color *c1 = new Color;
c1->print1("red"); // red
c1->print1("red", "blue"); // red and blue
}
7,12行目は、クラスの同じメンバ関数名(print1)です。違いは引数の数が異なっています。
21行目は、引数が1つです。7行目の関数が実行されます。
22行目は、引数が2つです。12行目の関数が実行されます。
クラスのコンストラクタのオーバーロード
#include <iostream>
using namespace std;
class Color
{
private:
string name; //メンバ変数名
public:
Color(string str1) // コンストラクタ
{
this->name = str1;
};
public:
Color(string str1, string str2) // コンストラクタ
{
this->name = str1 + " and " + str2;
};
public:
void print1() // メンバ関数
{
cout << name << "\n";
};
};
int main()
{
Color *c1 = new Color("red");
c1->print1(); // red
Color *c2 = new Color("red","blue");
c2->print1(); // red and blue
}
9,14行目は、クラスの同じコンストラクタ名(color)です。違いは引数の数が異なっています。
27行目は、引数が1つです。9行目のコンストラクタが実行されます。
30行目は、引数が2つです。14行目のコンストラクタが実行されます。
関連の記事