1。
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2。
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
どちらも機能します。どちらが標準的な方法で、なぜですか?
1。
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2。
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
どちらも機能します。どちらが標準的な方法で、なぜですか?
回答:
宣言をヘッダーファイルに入れ、定義を別の.cpp
ファイルに入れ#include
、ヘッダーを別の.cpp
ファイルに入れると、違いを確認できます。
具体的には、次のように仮定します。
int Add(int a, int b);
int Add(int a, int b = 3) {
...
}
#include "lib.h"
int main() {
Add(4);
}
のコンパイルでtest.cpp
は、デフォルトのパラメータ宣言が表示されず、エラーが発生して失敗します。
このため、デフォルトのパラメーター定義は通常、関数宣言で指定されます。
int Add(int a, int b = 3);
b
は、のデフォルト値は、ヘッダーを含む各 .cpp
ファイルに対して1回定義されます。ただし、Add
関数の宣言は1つしかないため、問題ありません。
C ++では、パラメーターリスト内の場所に関してデフォルト引数に課される要件は次のとおりです。
特定のパラメーターのデフォルト引数は、1回のみ指定する必要があります。同じデフォルト値でも、2回以上指定することはできません。
デフォルトの引数を持つパラメータは、パラメータリストの最後に隣接するグループを形成する必要があります。
これを念頭に置いて、C ++では、上記の要件が継続的に満たされている限り、関数の宣言から次の宣言にデフォルト引数を持つパラメーターのセットを「拡張」することができます。
たとえば、デフォルトの引数なしで関数を宣言できます
void foo(int a, int b);
このような宣言の後にその関数を呼び出すには、両方の引数を明示的に指定する必要があります。
同じ翻訳単位の後で(さらに下に)、もう一度再宣言できますが、今回は1つのデフォルト引数を使用します
void foo(int a, int b = 5);
この時点から、明示的な引数を1つだけ指定して呼び出すことができます。
さらに下の方で、再宣言して、デフォルト引数をもう1つ追加できます。
void foo(int a = 1, int b);
この時点から、明示的な引数なしで呼び出すことができます。
完全な例は次のようになります
void foo(int a, int b);
int main()
{
foo(2, 3);
void foo(int a, int b = 5); // redeclare
foo(8); // OK, calls `foo(8, 5)`
void foo(int a = 1, int b); // redeclare again
foo(); // OK, calls `foo(1, 5)`
}
void foo(int a, int b)
{
// ...
}
あなたの質問のコードについては、どちらのバリアントも完全に有効ですが、意味が異なります。最初のバリアントは、2番目のパラメーターのデフォルト引数をすぐに宣言します。2番目のバリアントは、最初にデフォルトの引数なしで関数を宣言し、次に2番目のパラメーターに1つ追加します。
両方の宣言の正味の効果(つまり、2番目の宣言に続くコードで見られる方法)はまったく同じです。関数には2番目のパラメーターのデフォルト引数があります。ただし、最初の宣言と2番目の宣言の間にコードを詰め込んだ場合、これらの2つのバリアントの動作は異なります。2番目のバリアントでは、関数は宣言の間にデフォルトの引数を持たないため、両方の引数を明示的に指定する必要があります。
void foo(int a = 1, int b)
動作させるには、の後 に宣言する必要がありvoid foo(int a, int b = 5)
ます。はい、動作します。いいえ、それは構文エラーではありません。g ++ 4.5.3は完全にコンパイルします。
int foo(int)
です。int foo(int=5)
パラメータ名を省いて、もう一度書くことができることがわかりました。まだ誰もそれについて言及していないようです。
最初の方法は2番目の方法よりも優先されます。
これは、ヘッダーファイルにパラメーターがオプションであり、そのデフォルト値が何であるかが示されるためです。さらに、これにより、対応する.cppファイルの実装に関係なく、デフォルト値が同じになります。
2番目の方法では、2番目のパラメーターのデフォルト値の保証はありません。対応する.cppファイルの実装方法に応じて、デフォルト値が変わる可能性があります。
b
、を含むコンパイル単位ごとに一度、複数回定義されlib.h
ますか?