2013年8月16日金曜日

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

C++では、引数の型や数が違う同じ名前の関数を複数定義することができます。
この機能がオーバーロードというものです。
次の例を見てください。^^

同じ名前の関数を複数定義
//第一引数がint型、第二引数がdouble型
double GetCircleArea(int radius, double pi)
{
    return radius * radius * pi;
}

//第一引数がdouble型、第二引数がdouble型
double GetCircleArea(double radius, double pi)
{
    return radius * radius * pi;
}

//第一引数がdouble型、第二引数なし
double GetCircleArea(double radius)
{
    return radius * radius * 3.141592;
}

何と、3つの関数名は全く同じです(^_^;)
C++ではこんなこともできるのですね、さすが「++」だと思います。
C言語では引数が違うだけだと、別の関数名をつけなくてはなりませんでしたね。

GetCircleArea()関数は、どれも円の面積を求める関数です。
それぞれ引数の型や数が違うだけです。
このように同じ機能でパターンの異なる引数を持つ場合に、関数名が1つになるので
便利です。名付け親の悩みがまた1つ解消されますね(^^)

同じ名前の関数が複数ある場合の呼び出し
オーバーロードを使えば、同じ名前の関数を複数定義できます。
これをどのように区別するかというと、コンパイラが引数の型と数を見て、
どの関数を呼び出すのかを決めているのです。

int main(void)
{
    int nRad = 20;
    double dRad = 20.5;
    double dArea = 0;

  //第一引数がint型、第二引数がdouble型のGetCircleArea()を呼び出し
    dArea = GetCircleArea(nRad, 3.141592);
    cout << "area1 : " << dArea << endl;

    //第一引数がdouble型、第二引数がdouble型のGetCircleArea()を呼び出し
    dArea = GetCircleArea(dRad, 3.141592);
    cout << "area2 : " << dArea << endl;

    //第一引数がdouble型のGetCircleArea()を呼び出し
    dArea = GetCircleArea(dRad);
    cout << "area3 : " << dArea << endl;
 
    return 0;
}
    
実行結果例(ちゃんと呼び分けられていますね^^)
# ./test
area1 : 1256.64
area2 : 1320.25
area3 : 1320.25


オーバーロード使用時の注意点
戻り値の型だけが違う関数は、オーバーロードできません。

//OK(戻り値と引数が異なっている)
double GetCircleArea(double radius, double pi);int GetCircleArea(int radius, double pi);

//NG(戻り値だけが異なっている)
double GetCircleArea(double radius, double pi);int GetCircleArea(double radius, double pi);

NGの場合を試してみると分かりますが、コンパイルエラーになります。(^_^;)
error: new declaration ‘int GetCircleArea(double, double)’
error: ambiguates old declaration ‘double GetCircleArea(double, double)’



今日の名言
目の前に多くの困難が横たわっていると、つい身をかわして他の者に仕事を変わって
もらおうという気になりがちだが、私はそんな卑怯なやり方はごめんだ。自分の職務に
踏みとどまって義務を果たすためにがんばりとおす覚悟だ。
                                     ウィンストン・チーチャル

恐怖と悩みを克服するには、脇目もふらずに働くことだ!!
                                     デール・カーネギー

何事かを試みて失敗するものと、何事も試みないで成功するものとの間には、
計り知れない相違がある。
                                     ロイド・ジョーンズ