2013年8月17日土曜日

C++ オーバーロード其の弐

今回はオーバーロードとデフォルト引数の関係性についてみていきます。^^

実はオーバーロードを使ってもデフォルト引数を使った場合でも、同じ関数を
複数の方法で呼び出すことができるのです。
具体的には次の例を見てください。

//オーバーロードの場合
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・ロバートソン

世界史に残るような偉大で堂々たる業績は、すべて何らかの熱中が
もたらした勝利である。
                                ラルフ・ワルド・エマーソン