以为是重载,其实是默认函数参数
在阅读Android源码的时候,碰到了函数调用的参数个数与函数定义时对不上的情况,一开始以为是重载,但后来发现是使用了默认函数参数。情况如下:
在文件中,对Bcond只有一处定义,又不是重载,那么在调用的时候到底是如何调用的呢?但在Bcond函数定义的地方找到了定义处的猫腻:
如果没有传入rhs,那么默认为0
默认函数参数可以不传参
为了验证我们的猜想,在查阅资料的同时,也可以自己写案例来实验一下:
#include <iostream>
using namespace std;
class Para{
private:
int m_a;
double m_b;
public:
Para(int a, double b, int c = 2);
};
Para::Para(int a, double b, int c) : m_a(a), m_b(b){
cout << m_a << endl;
cout << m_b << endl;
cout << c << endl;
}
int main(){
Para(1, 2.6);
return 0;
}
Para()构造函数在定义的时候给变量c定义了默认参数为2,在调用的时候并没有给Para传递第三个参数,依然可以打印出我们想要的结果:
如果我们依然给Para传递第三个参数:
Para(1, 2.6, 1);
,结果如下:结果输出的是我们传递的参数。
函数的默认参数可以不止一个
默认参数需要注意的地方
- 函数的默认参数只能放在后面,像这样定义就是错误的:
Para(int a, double b = 2.6, int c);
-
函数的默认参数只能出现一次,即不可以在定义和声明中重复出现比如:
- 函数的默认参数可以出现在定义处,可以在声明处。
在实验中发现一个有意思的现象,可以交叉定义,但是不推荐这么用: