C++函数重载和设定缺省参数

一、缺省参数

  1. 在函数声明或定义时,直接对参数赋值,这就是默认参数;例如 int f(int i = 0);
  2. 在函数调用时,省略部分或全部参数,这时可以用默认参数来代替,例如 f()相当于f(0);
    需要注意的是
  1. 默认参数只可在函数声明中设定一次,如果没有函数声明的话,才可以在函数定义里设定。
  2. 默认参数还可以有多个,但所有默认参数必须放在参数表的右侧,即先定义所有的非默认参数,再定义默认参数。
  3. 默认参数并不一定是常量表达式,可以是任意表达式,则函数每次被调用时该表达式被重新求值,但表达式必须有意义。

缺省参数有时候会出现这样的问题:
void f(int first, int second = 0, int third = 1) 调用的时候 f(first,third) 期望的是 f(first,0,third) 实际则达不到效果

二、 函数重载

在C++中,如果需要定义几个功能相似,而参数类型不同的函数,那么这样的几个函数可以使用相同的函数名,这就是“函数重载”。

C++调用重载函数的匹配过程是

  1. 参数严格匹配(参数个数、类型完全一致)的函数
  2. 参数通过内部类型转换后匹配的函数
  3. 参数通过用户定义的类型转换后匹配的函数

三、什么时候使用函数重载和默认参数呢

effecitve C++ 中给了这样的一句话

答案取决于另外两个问题。第一,确实有那么一个值可以作为缺省吗?第二,要用到多少种算法?一般来说,如果可以选择一个合适的缺省值并且只是用到一种算法,就使用缺省参数。否则,就使用函数重载。

什么意思呢?书中举了两个例子

int max(int a,
        int b = std::numeric_limits<int>::min(),
        int c = std::numeric_limits<int>::min(),
        int d = std::numeric_limits<int>::min(),
        int e = std::numeric_limits<int>::min())
{
  int temp = a > b ? a : b;
  temp = temp > c ? temp : c;
  temp = temp > d ? temp : d;
  return temp > e ? temp : e;
}

这个函数中,所选用的缺省值不可能影响到所采用的算法计算的正确性

而另一个例子 求平均值的函数

double avg(int a);
double avg(int a, int b);
double avg(int a, int b, int c);
double avg(int a, int b, int c, int d);
double avg(int a, int b, int c, int d, int e);

这里就不能用缺省参数,因为函数的结果取决于传入的参数的个数:如果传入3个值,就要将总数除以3;如果传入5个值,就要将总数除以5。

 

参考:《Effective C++》