★デフォルト引数とオーバーロードの問題点★


ここまで説明した「デフォルト引数」と「関数のオーバーロード」を組み合わせた時に発生する問題について説明します。

まず、デフォルト引数を使った関数を1つ作ります。

<sample program cpp010-01>

#include <iostream>

void ShowValue(const int value = 0);

int main()
{
    ShowValue();

    ShowValue(5);

    return 0;
}

void ShowValue(const int value)
{
    std::cout << "value = " << value << std::endl;
}

<実行結果>

value = 0
value = 5
続行するには何かキーを押してください・・・

次に同じ名前で引数を2つ受け取るオーバーロード関数を追加します。

<sample program cpp010-02>

#include <iostream>

void ShowValue(const int value = 0);

void ShowValue(const int value1, const int value2);

int main()
{
    ShowValue();

    ShowValue(5);

    ShowValue(2, 4);

    return 0;
}

void ShowValue(const int value)
{
    std::cout << "value = " << value << std::endl;
}

void ShowValue(const int value1, const int value2)
{
    std::cout << "value1 = " << value1 << std::endl;
    std::cout << "value2 = " << value2 << std::endl;
}

<実行結果>

value = 0
value = 5
value1 = 2
value2 = 4
続行するには何かキーを押してください・・・

関数ShowValueの呼び出しは、

ShowValue();

ShowValue(5);

ShowValue(2, 4);

この3通りですが、どれも呼び出す関数が判別出来ます。

ShowValue();

これは、引数がありませんからデフォルトを使って引数が1つのShowValue関数を呼び出します。

ShowValue(5);

これは、引数が1つですのでそのまま引数が1つのShowValue関数を呼び出します。

ShowValue(2, 4);

これは、引数が2つですのでそのまま引数が2つのShowValue関数を呼び出します。

さて、ここで引数が2つのShowValue関数にデフォルトの値を設定してみます。

<sample program cpp010-03>

#include <iostream>

void ShowValue(const int value = 0);

void ShowValue(const int value1,  const int value2 = 0);

int main()
{
    ShowValue();

    ShowValue(5);

    ShowValue(2, 4);

    return 0;
}

void ShowValue(const int value)
{
    std::cout << "value = " << value << std::endl;
}

void ShowValue(const int value1, const int value2)
{
    std::cout << "value1 = " << value1 << std::endl;
    std::cout << "value2 = " << value2 << std::endl;
}

<コンパイル結果>

error C2668: 'ShowValue': オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
note: 'void ShowValue(const int,const int)' の可能性があります
note: または 'void ShowValue(const int)'
note: 引数リスト '(int)' を一致させようとしているとき

コンパイルエラーになりました。

メッセージを見ると、

void ShowValue(const int,const int)

void ShowValue(const int)

この2つの区別が付かないという事でしょう。

ShowValue(5);

と書いた時に、引数が1つの関数を呼ぶのか、引数が2つの関数でデフォルトの値を使って呼ぶのか判断出来ません。

このように、「デフォルト引数」と「関数のオーバーロード」を併用する際には気を付けてください。


次へ

戻る

目次へ