2

こんにちは私は混乱している、またはもっと言うために私は何かを理解する必要があります。プロシージャと同じオーバーロードされたプロシージャがあります。

    string conct (string a, string b) {
      string str = conct(a, b, "string");
      return str;
    }

    string conct (string a, string b, const char* c) {
      // do the processing;
      return concatenated_string;
    }

2つのオーバーロードされた関数を使用する代わりにc、オーバーロードされた関数をデフォルトの引数として作成することは可能ですか。そのため、誰かが2つの引数しか渡さなくても、その場合を処理する関数を1つだけ持つことができます。

しかし、私の主な関心事は、現在の3番目の議論にありますconst char* c。したがって、のようなものにしconst char* c = "string"た場合、デフォルトの引数を持つ1つの関数でオーバーロードを削除する場合を処理する正しい方法でしょうか。

私はここで投稿を見ましたが、それは私が持っている混乱ではなく、コンパイルに焦点を当てているようです。

4

2 に答える 2

3

はい、オーバーロードされた関数を1つの関数とデフォルトの引数に置き換えることができます。

string conct (string a, string b, const char* c = "string") {
  // do the processing;
  return concatenated_string;
}
  • 関数をオーバーロードすると、コンパイラは関数ごとにコードを生成するため、コードサイズが大きくなる可能性があります。
  • オーバーロードがあなたの場合のように薄いラッパーとして機能する場合、オプティマイザーは余分な作業を排除する可能性があります。
  • デフォルトの引数は関数内ではなく呼び出し元の場所に設定されるため、デフォルトの引数は公開されている必要があり、変更するにはすべての呼び出し元を再コンパイルする必要があります。あなたのようなオーバーロードでは、psuedo-default引数は隠された詳細になります。
于 2013-01-11T19:24:55.740 に答える
0

デフォルト値は関数プロトタイプで使用できますが、中間引数をデフォルトにする場合は、すべての値を右側にデフォルト設定する必要があります...一方、関数のオーバーロードは、可能なすべての引数の組み合わせに対して実行でき、デフォルト値も必要です。関数呼び出しスタックに配置されないため、コンパイラの作業が少なくなります。

于 2015-06-05T12:13:20.860 に答える