デフォルト引数とは
C++では、関数の引数に初期値を決めておくことが出来ます。
例えば以下のように使います。
default_sample.cpp
int sum(int x = 1, int y = 1) { return x + y; }
引数を足した値を返す簡単な関数ですが、デフォルト引数を指定しています。
この関数は以下の4つのパターンで呼び出すことができます。その際の返り値も示しています。
呼び出し方
f(2,3);
f();
f(2);
f(,3);
返り値
5
2
3
4
お分かりでしょうか。
1行目は簡単ですね。一般的な引数を持つ関数の呼び出しです。
2+3=5になります。
2行目は引数がないので一見エラーになるように思えますが、デフォルト引数を指定しているため、1+1=2になります。
3,4行目はデフォルト引数と通常の引数の指定を組み合わせたものとなります。
3行目ではxに2を指定し2+1=3。
4行目ではyに3を指定し1+3=4となります。
これを使うことで、多くの場合変更の無い引数の指定を省略することが出来ます。
ライブラリを使っていると、普段は不要なオプションを隠すことが出来るのでよく用いられます。
デフォルト引数は、コンパイラが最初にその関数を発見するところで記述する必要があります。
すなわち、main()関数よりその関数を前に記述した場合は関数の定義で、プロトタイプ宣言を行っている場合はプロトタイプ宣言内で指定します。
上記の例は関数の定義内で指定したものです。
オーバーロードとは
C++では、引数の型や数が違えば、名前が同じでも別の関数として扱われます。これを関数のオーバーロードといいます。
overload_sample.cpp
int sum(int x, int y) { return x + y; }
先程と同様の関数です。(デフォルト引数は指定していません。)
当たり前ですが、この関数では2つの数しか足すことができません。
ですが、オーバーロードを用いると、
overload_sample2.cpp
int sum(int x, int y) { return x + y; } int sum(int x, int y, int z) { return x + y + z; }
同一コード内に同じ名前の変数を複数書くことができます。
引数を2つ指定した場合は上の関数、3つ指定した場合は下の関数が呼び出されます。
また、この関数はint型しか扱うことができませんが、オーバーロードを使うと、
overload_sample3.cpp
int sum(int x, int y) { return x + y; } double sum(double x, double y) { return x + y; }
このように引数にintを指定した場合でも、doubleを指定した場合でもエラーを起こすことなく記述ができます。
ただし、引数が同じで戻り値の型だけが違う、というパターンは記述できません。
呼び出し時点で、どちらの関数を呼び出せばいいかコンパイラが区別できないからです。
デフォルト引数とオーバーロード
デフォルト引数とオーバーロードはどちらも関数の引数に関する機能でした。
ここで両方を同時に使うとどうなるでしょうか。例を見てみましょう。
overload_sample4.cpp
int sum(int x, int y) { return x + y; } int sum(int x, int y, int z = 0) { return x + y + z; }
オーバーロードの例題のzにデフォルト引数として0を指定しました。
これを
sum(1, 2);
と呼び出すとどちらが呼び出されるでしょうか。
答えはどちらも呼び出されずコンパイルエラーになります。
この場合だと上の関数を呼び出しているのか、下の関数のzを省略して呼び出しているのか判別できません。
文法的に間違っていなくてもこれでエラーになるので注意しましょう。