1. 函数默认参数和占位参数(亚元)

形参中的占位参数又叫亚元,并没有什么实际意义,只在函数重载中起到作用

// 亚元,设置了默认值所以调用时可以不传参数
// 否则就必须传入两个参数
void foo(int a, int = 0){           
    cout << "a = " << a << endl;
}
int main()
{
    foo(20);
    return 0;
}

2. 函数重载

  1. 函数名相同,形参列表不同(形参个数、类型、顺序)
  2. 函数返回值不起作用
  3. 函数重载和默认参数不要同时使用(函数调用时容易产生二义性)
  4. 倾轧技术(name mangling),底层会将函数名进行编译
    • v c i f l d 表示 void char int float long double 及其引用
    • int fun(int) => fun_i
      int fun(int, char, double) => fun_icd
  5. 重载函数匹配顺序
    • 如果能够严格匹配,则调用完全匹配的
    • 如果没有完全匹配的,则调用隐式转换的
    • 都匹配不上,编译失败

3. 函数指针

int test(int a, int b){
    cout << "test(" << a << ", " << b << ")" << endl;
    return 0;
}
// 方式一:
typedef int(FUN)(int, int);

// 方式二:
typedef int(*FUN_P)(int, int);

int main()
{
    // 方式一:
    FUN *f1 = NULL;
    f1 = test;
    f1(10, 20);
    (*f1)(10, 20);
    // 方式二:
    FUN_P f2 = NULL;
    f2 = test;
    f2(10, 20);
    // 方式三:
    int (*f3)(int, int) = NULL;
    f3 = test;
    f3(10, 20);

    return 0;
}

输出:

Start
test(10, 20)
test(10, 20)
test(10, 20)
test(10, 20)
0
Finish