今回はオーバーロードとデフォルト引数の関係性についてみていきます。^^
実はオーバーロードを使ってもデフォルト引数を使った場合でも、同じ関数を
複数の方法で呼び出すことができるのです。
具体的には次の例を見てください。
//オーバーロードの場合
double GetCercleArea(double radius, double pi); //プロトタイプ宣言です。
double GetCercleArea(double radius); //これもプロトタイプ宣言です。
:
int main(void)
{
double ans = 0;
//2種類とも呼び出しています
ans = GetCercleArea(20.5, 3.141592);
cout << "ans1 : " << ans << endl;
ans = GetCercleArea(12.5);
cout << "ans2 : " << ans << endl;
:
//デフォルト引数の場合
double GetCercleArea(double radius, double pi = 3.141592); //プロトタイプ宣言です。
:
int main(void)
{
double ans = 0;
//2種類の方法で呼び出しています
ans = GetCercleArea(20.5, 3.141592);
cout << "ans1 : " << ans << endl;
ans = GetCercleArea(12.5);
cout << "ans2 : " << ans << endl;
:
おっと、これではどちらを使ったらよいのか迷ってしまいますね(^_^;)
それでは次にどちらを使うべきかについてみて行きましょう。
もし関数内の処理が1種類でよいときには、デフォルト引数を使うべきです。
例えば2つの値の合計を計算する関数と、3つの値の合計を計算する関数があるとします。
この場合は、計算結果に影響しないようデフォルト引数を0にして関数を定義すれば
ひとまとめにすることができます。^^
//3つめのデフォルト引数が0であることがポイント
double GetTotal(double a, double b, double c = 0)
{
//引数が2つであっても3つであってもどちらでも対応可能です。
return a + b + c;
}
そして、一方2つの値か3つの値のどちらかの平均値を計算する関数がある場合は
適切なデフォルト引数がありませんので、オーバーロードを使用します。
//2つの値の平均値を求める
double GetAverage(double a, double b)
{
return (a + b) / 2;
}
//3つの値の平均値を求める
double GetAverage(double a, double b, double c)
{
return (a + b + c) / 3;
}
このように引数2つのGetAverage()関数と引数3つのGetAverage()関数の
2つを用意します。
間違ってもGetAverage2()、GetAverage3()などという名前で
定義しないよう注意してください。(^_^;)
せっかくのC++の機能が台無しになってしまいますので。
それぞれの使いどころをしっかりとマスターして、上手に使い分けたいものですね^^
今日の名言
恐れおののいている間はまだ災いは本格的でない。勇敢に立ち向かうべきときは、
いよいよ手の下しようがなかったときだ。
ウィンストン・チーチャル
luck(幸運)にPが加わってpluck(勇気)となれば、鬼に金棒である。
作者不明
大きな過ちを多く犯さないうちは、どんな人間でも偉人や善人にはなれない。
ウィリアム・グラッドストン
信念は人を強くする。疑いは活力を麻痺させる。信念は力である。
フレデリック・W・ロバートソン
世界史に残るような偉大で堂々たる業績は、すべて何らかの熱中が
もたらした勝利である。
ラルフ・ワルド・エマーソン