C++の過負荷関数

5911 ワード

過負荷関数の定義:同じ関数名で異なる関数を定義します.関数名と異なるパラメータを組み合わせると、関数の意味が異なります.
過負荷関数の判断基準:関数リロードは少なくとも以下の条件を満たす:パラメータ個数の異なるパラメータタイプの異なるパラメータ順序の異なる関数戻り値は関数リロードの判断基準ではない
リロード関数を呼び出すガイドライン:すべての同名関数を候補として実行可能な候補関数を探してみます:1)実パラメータを正確に一致させます2)実パラメータをデフォルトパラメータで一致させることができます3)実パラメータをデフォルトタイプで変換して一致させることに失敗しました:1)最終的に探した実行可能な候補関数が一意でない場合、二義性が現れ、コンパイルに失敗します.2)すべての候補者を一致させることができず,関数が定義されず,コンパイルに失敗した.
注意:リロード関数は本質的に互いに独立した異なる関数(静的チェーン)リロード関数の関数タイプが異なる関数戻り値が関数リロードの根拠とならない関数リロードは関数名とパラメータリストによって決定されます.
関数リロードと関数ポインタ:リロード関数名を使用して関数ポインタに値を割り当てる場合:リロード規則に基づいて関数ポインタパラメータリストと一致する候補を選択し、候補の関数タイプと関数ポインタの関数タイプを厳密に一致させる
#include 

void print_int(int a)
{
    printf ("a = %d
"
, a); } void print_char(char c) { printf ("c = %c
"
, c); } void print_str(char *str) { printf ("str = %s
"
, str); } // : , , // void printA(int a) { printf ("a = %d
"
, a); } // void printA(int a, int b) { printf ("a = %d, b = %d
"
, a, b); } // void printA(int a, int b,int c) { printf ("a = %d, b = %d, c = %d
"
, a, b, c); } void printA(int a, char *str) { printf ("a = %d, str = %s
"
, a, str); } void printA(char *str, int a) { printf ("a = %d, str = %s
"
, a, str); } void printA(char c) { printf ("c = %c
"
, c); } void printA(char *str) { printf ("str = %s
"
, str); } // :123、 // //int printA(int a) //{ // //} int main9_2() { int a = 10; char c = 'a'; char *str = "hello"; // printA(10, 20); printA(10,20,30); printA(a); printA(c); printA(str); return 0; } int main9_1() { int a = 10; char c = 'a'; char *str = "hello"; print_int(a); print_char(c); print_str(str); return 0; } // , int sub(int &a, int &b) { return a - b; } int sub(const int &a, const int &b) { return a - b; } int main9_3() { sub(10, 20); int a = 10; int b = 20; sub(a, 10); return 0; } // , void , int typedef void (*PFUNC)(int); int main() { // // PFUNC pfunc = printA; pfunc(10); return 0; }