著者:Ma Zhifeng
リンク:https://zhuanlan.zhihu.com/p/23899851
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
リンク:https://zhuanlan.zhihu.com/p/23899851
出典:
著者がほぼ著作権を所有していることを知ってい ます。商用の再版については、著者に連絡して許可を得てください。非商用の再版については、出典を示してください。
ステートメント:
- 記事の内容は「C ++ Primer Chinese Edition(5th Edition)」から収集・編集されたものであり、著作権は原本に帰属します。
- オリジナルの本はより詳細で素晴らしい解釈を持っています、学習のために本物の本を購入してください。
- この記事は学習とコミュニケーションのみを目的としており、いかなる形式の転載も禁止されています
複数のオーバーロードされた関数がある場合、どれが呼び出されますか?
void f();
void f(int);
void f(int, int);
void f(double, double=3.14);
f( 5.6 );
関数マッチングプロセス
- 候補関数として呼び出しサイトに表示される同じ名前のすべての関数を検索します
- 同じ数のパラメーターを見つけて、実行可能関数と呼ばれる、仮パラメーターの同じ関数または変換可能な関数に実際に参加します。
- 最適なものを見つける
上記の例の場合
- 4つの機能が候補機能です
- 1番目と3番目のパラメーターは数が異なり、除外されます。2番目と4番目は実行可能な関数です。
- 実際のパラメータータイプが近いほど、それらの一致が良くなるため、ここでf(5.6)は4番目の関数を呼び出します。
複数の仮パラメータの場合
以下の条件を同時に満たす必要があります
- 各引数のマッチングは、他の実行可能な関数のマッチングより劣っていません。
- 少なくとも1つの引数の一致は、他の実行可能な関数の一致よりも優れており
、条件を満たす関数は1つだけです。
たとえば、f(42、5.6);、 f(int、int)は最初のパラメーターを考慮した場合に勝ち、f(double、double)は2番目のパラメーターを考慮した場合に勝つため、最適な一致はなく、呼び出しは間違っています。
引数型変換
前述のように、実際のパラメーターと正式なパラメーターのタイプが近いほど、一致度は高くなります。次の並べ替えルールがあります。
- 完全に一致
- 実際のパラメータと仮パラメータは同じタイプです
- 実際のパラメーターは、配列または関数タイプから対応するポインターに変換されます
- トップレベルのconstを実際のパラメーターに追加するか、トップレベルのconstを実際のパラメーターから削除します
- const変換によるマッチング
- タイププロモーションによるマッチング
- 算術型変換またはポインター変換によって達成されるマッチング
- クラス型変換によるマッチング
要するに、エラーの呼び出しを避けるために、プログラムのオーバーロードされた関数に注意する必要があります