関数のオーバーロード


概要

関数のオーバーロードとはC++で実装できるようになった機能で、
同じ関数名であったとしても引数の数と型の種類が異なったら
別の関数として定義することができます。

// 指定した座標に画像を描画する
void DrawTexture(float x, float y, Image img);

// 画像の一定範囲を指定された座標に描画する
void DrawTexture(float x, float y, Image img, float tu, float tv, float width, float height);

上記のソースではDrawTexture関数を二つ宣言していますが、
引数の内容が異なるのでコンパイラは別の関数として認識してエラーにはなりません。
このようにオーバーロードでは同名の関数で処理パターンを複数作成できます。

メリット

関数のオーバーロードのメリットは「関数使用側の負担軽減」と
「関数名に悩まなくて済む」ところです。

関数使用側の負担軽減

オーバーロードは関数を使用する側の負担を軽減することに繋がります。

// 指定した座標に画像を描画する
void DrawTexture(float x, float y, Image img);

// 画像の一定範囲を指定された座標に描画する
void DrawTexture(float x, float y, Image img, float tu, float tv, float width, float height);

どちらも画像を描画する関数ということは関数名で分かります。
これをオーバーロードを使用しない場合、以下のように名前を変える必要があります。

// 指定した座標に画像を描画する
void DrawTexture(float x, float y, Image img);

// 画像の一定範囲を指定された座標に描画する
// ※UVMapping:画像の一部を切り取った内容を描画する手法
void DrawUVMappingTexture(float x, float y, Image img, float tu, float tv, float width, float height);

上のコードでは画像を描画したいと考えたときに
使用者は二つの関数名を覚えておかなければいけません。
この関数の数が三つ、四つと増えると画像描画関数を使うために
それらの関数名を覚えておかなければいけません。

しかし、オーバーロードを使用すれば「DrawTexture」だけで済むので
種類が増えても関数名を忘れたり、迷ったりすることはなくなります。
このことから、使用側の負担が軽減したと考えれます。

関数名に悩まなくて済む

関数名はしっかりとした意味を持たせる必要があります。
そうしないと使用側が関数の挙動の意図を理解して使うことができないからです。
しかし、同じような挙動の関数が増えると名前も似たようなものになってしまうので、
命名に非常に悩んでしまいます。

これをオーバーロードを使用すれば名前の統一を行えるので、
同種の関数が増えたとしても命名に悩む必要がなくなります。

デメリット

オーバーロードのデメリットは「複数ある関数の数の把握や
どれを使えばいいか分かりづらくなる」ところです。
関数名が全て同じなので引数や宣言などに書かれている
コメントの内容から判断する必要があります。

しかし、近年のIDE(Visual Studio等)は関数名を打ち込めば
オーバーロードの種類や数をコメント付きで表示してくれたり、
宣言先へジャンプしてくれたりと非常に優秀なので
そこまで不便に感じることは少ないと思います。

注意点

オーバーロードの注意点は「戻り値のみ異なるとエラーになる」ことです。
関数名と引数の型の種類と数が一致しており、戻り値だけが異なる関数は
オーバーロード関数として認識されずにエラーとなるので注意してください。

int Divide(int num01, int num02);
float Divide(int val01, int val02);
			
int Divide(int num01, int num02)
{
	return num01 / num02;
}

float Divide(int val01, int val02)
{
	return (float)val01 / val02;
}

void main(void)
{
	printf("%d\n", Divide(10, 2));
}

上のコードのDivideのように戻り値のみ異なる関数はオーバーロード関数として
認識されないので注意してください。
また、変数名を違う名前にしても意味がないので注意してください。
オーバーロードの条件は関数名と引数の型の種類と数が異なることです。