C++では、関数についても新しい機能が用意されています。
最初は「デフォルト引数」について説明します。
サンプルを書きましょう。
<sample program cpp008-01>
#include <iostream> void ShowValue(const int value); int main() { ShowValue(25); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 25 続行するには何かキーを押してください・・・
まだ「デフォルト引数」は使っていません。
普通に「const int型」の引数を受け取る関数です。
この引数valueにデフォルトの値を設定することが出来るのです。
<sample program cpp008-02>
#include <iostream> void ShowValue(const int value = 10); int main() { ShowValue(25); ShowValue(); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 25 value = 10 続行するには何かキーを押してください・・・
プロトタイプ宣言のvalueの右側にデフォルトの値10を設定しました。
※本体には書きません。
1回目の呼び出しでは、引数に25が設定されているのでその数値が表示されています。
2回目の呼び出しには引数がありません。
引数が無い場合はデフォルトの値が使用されるのです。
大事なのは使い道ですが、良い例が無いので、言葉で書きます。
ある関数が10箇所から呼び出されるとします。
その関数の引数は9箇所は0で、残り1箇所は1です。
引数に1と書くのは10の内1回だけです。
この場合、デフォルトの値を0に設定しておくことで何度も同じ値を書かなくて済みます。
↓は適当なサンプルです。
<sample program cpp008-03>
#include <iostream> void ShowValue(const int value = 0); int main() { ShowValue(); ShowValue(); ShowValue(); ShowValue(); ShowValue(1); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 0 value = 0 value = 0 value = 0 value = 1 続行するには何かキーを押してください・・・
もう1つ、複数の引数を持った関数へのデフォルトについて説明します。
<sample program cpp008-04>
#include <iostream> int Multiply(const int lhs, const int rhs); int main() { std::cout << Multiply(3, 4) << std::endl; return 0; } int Multiply(const int lhs, const int rhs) { return lhs * rhs; } |
<実行結果>
12 続行するには何かキーを押してください・・・
2つの値を渡して乗算した結果を返すMultiply関数です。
この関数の引数rhsにデフォルトの値を設定してみます。
<sample program cpp008-05>
#include <iostream> int Multiply(const int lhs, const int rhs = 1); int main() { std::cout << Multiply(3, 4) << std::endl; std::cout << Multiply(5) << std::endl; return 0; } int Multiply(const int lhs, const int rhs) { return lhs * rhs; } |
<実行結果>
12 5 続行するには何かキーを押してください・・・
rhsにはデフォルトの値が設定してありますから、
Multiply(5) |
と書いた場合、rhsにはデフォルトの値1が適用されます。
では、rhsではなくlhsの方にデフォルトの値を設定してみましょう。
<sample program cpp008-06>
#include <iostream> int Multiply(const int lhs = 1, const int rhs); int main() { std::cout << Multiply(3, 4) << std::endl; std::cout << Multiply(5) << std::endl; return 0; } int Multiply(const int lhs, const int rhs) { return lhs * rhs; } |
<コンパイル結果>
error C2548: 'Multiply': 2 番目の引数に対して既定の引数がありません。 error C2660: 'Multiply': 関数に 1 個の引数を指定できません。
コンパイル時にエラーになりました。
2 番目の引数に対して既定の引数がありません。
と書いてあります。
2番目の引数とはrhsの事です。
言葉は伝わり難いかも知れませんが、デフォルト引数は「右詰め」で設定しなければなりません。
int Multiply(const int lhs, const int rhs); |
このように複数の引数があった場合、rhsからデフォルトの値を設定する必要があります。
rhsにデフォルトの値が設定されている場合、lhsにもデフォルトの値が設定出来ます。
最後のサンプルを見てみましょう。
<sample program cpp008-07>
#include <iostream> int Multiply(const int lhs = 2, const int rhs = 8); int main() { std::cout << Multiply(3, 4) << std::endl; std::cout << Multiply(5) << std::endl; std::cout << Multiply() << std::endl; return 0; } int Multiply(const int lhs, const int rhs) { return lhs * rhs; } |
<実行結果>
12 40 16 続行するには何かキーを押してください・・・
rhsとlhsにデフォルトの値を設定しました。
Multiply(3, 4) |
この場合、デフォルトの値は使われませんので、
3 × 4 = 12
となります。
Multiply(5) |
この場合、デフォルトの値はrhsのみ使われますので、
5 × 8 = 40
となります。
Multiply() |
この場合、デフォルトの値はlhsとrhsの両方が使われますので、
2 × 8 = 16
となります。
そこまで頻繁に使うものではありませんが、覚えておくと便利です。