329

デフォルトのパラメータ値の場所は? 関数定義、宣言、またはその両方で?

4

10 に答える 10

337

呼び出し元に表示されるのはデフォルトのパラメーター値だけなので、デフォルトのパラメーター値を宣言に表示する必要があります。

編集:他の人が指摘しているように、あなたは定義について議論することができますが、それが真実ではないかのようにすべてのコードを書くことをお勧めします。

于 2011-02-14T06:42:38.793 に答える
101

どちらかを実行できますが、両方を実行することはできません。通常、これは関数宣言で行い、その後、すべての呼び出し元がそのデフォルト値を使用できます。ただし、代わりに関数定義でこれを行うことができます。そうすれば、定義を見た人だけがデフォルト値を使用できるようになります。

于 2011-02-14T06:41:37.640 に答える
94

C++ は呼び出し側に既定のパラメーター ロジックを配置します。これは、呼び出し元から既定値の式を計算できない場合、既定値を使用できないことを意味します。

他のコンパイル単位は通常、宣言だけを含むため、定義に配置されたデフォルト値の式は、定義するコンパイル単位自体 (および定義の後、つまりコンパイラがデフォルト値の式を見た後) でのみ使用できます。

最も便利な場所は宣言 (.h) で、すべてのユーザーがそれを見ることができます。

一部の人々は、実装にもデフォルト値の式を (コメントとして) 追加することを好みます。

void foo(int x = 42,
         int y = 21);

void foo(int x /* = 42 */,
         int y /* = 21 */)
{
   ...
}

ただし、これは重複を意味し、コメントがコードと同期していない可能性を追加します (コメントを外したコードよりも悪いことは何ですか? 誤解を招くコメントを含むコード!)。

于 2011-02-14T06:58:39.540 に答える
14

関数が公開されている場合 (非メンバー、パブリック、または保護)、呼び出し元はそれらについて知っている必要があり、既定値はヘッダーにある必要があります。

関数がプライベートでアウトオブラインである場合、クライアントの再コンパイルをトリガーしない変更を許可するため、実装ファイルにデフォルトを配置することは理にかなっています (エンタープライズ規模で共有される低レベルのライブラリでは深刻な問題になることがあります)。発達)。とは言っても、間違いなく混乱を招く可能性があり、API をより直感的な方法でヘッダーに表示することには文書化の価値があるため、妥協点を選択してください。ただし、説得力のある理由がない場合は一貫性が重要です。

于 2011-02-14T09:21:51.527 に答える
11

宣言は一般的に最も「有用」ですが、それはクラスをどのように使用したいかによって異なります。

両方とも無効です。

于 2011-02-14T06:43:41.330 に答える
10

良い質問です...コーダーは通常、デフォルトを宣言するために宣言を使用します。私はコンパイラに基づいて、どちらか一方に拘束されました(または警告されました)。

void testFunct(int nVal1, int nVal2=500);
void testFunct(int nVal1, int nVal2)
{
    using namespace std;
    cout << nVal1 << << nVal2 << endl;
}
于 2011-02-14T07:06:33.773 に答える
3

もう1点追加。デフォルトの引数を持つ関数宣言は、右から左上から下に並べる必要があります。

たとえば、以下の関数宣言では、宣言の順序を変更すると、コンパイラは既定のパラメーターが見つからないというエラーを返します。コンパイラが同じスコープ内でデフォルト引数を使用して関数宣言を分離できる理由は、RIGHT から LEFT (デフォルト引数) および TOP から BOTTOM (関数宣言のデフォルト引数の順序) の順序である必要があります。

//declaration
void function(char const *msg, bool three, bool two, bool one = false);
void function(char const *msg, bool three = true, bool two, bool one); // Error 
void function(char const *msg, bool three, bool two = true, bool one); // OK
//void function(char const *msg, bool three = true, bool two, bool one); // OK

int main() {
    function("Using only one Default Argument", false, true);
    function("Using Two Default Arguments", false);
    function("Using Three Default Arguments");
    return 0;
}

//definition
void function(char const *msg, bool three, bool two, bool one ) {
    std::cout<<msg<<" "<<three<<" "<<two<<" "<<one<<std::endl;
}
于 2014-06-18T14:15:17.730 に答える