int sum(int a, int b) {
return a + b;
}
1. 给默认值一定从右向左给
正确做法:
int sum(int a, int b = 20) {
return a + b;
}
int sum(int a = 10, int b = 20) {
return a + b;
}
错误做法:
int sum(int a = 10, int b) {
return a + b;
}
假设上面错误做法是正确的,我们调用时使用其默认值10,b的值给200,明显不对吧:
int main()
{
//cout << sum(,200) << endl;
return 0;
}
2. 带默认值和不带默认值的效率问题
int sum(int a = 10, int b = 20) {
return a + b;
}
2.1 不使用默认值时的调用汇编伪代码
int main()
{
int a = 10;
int b = 20;
int ret = sum(a,b);
//mov eax,dword ptr[ebp-8]
//push eax
//mov ecx,dword ptr[ebp-8]
//push ecx
//call sum
return 0;
}
2.2 使用一部分默认值时的调用汇编伪代码
int main()
{
int a = 10;
int b = 20;
int ret = sum(a);
//push 14H
//mov ecx,dword ptr[ebp-8]
//push ecx
//call sum
return 0;
}
2.3 完全使用默认值时的调用汇编伪代码
int main()
{
int a = 10;
int b = 20;
int ret = sum();
//push 14H
//push 0AH
//call sum
return 0;
}
2.3 传递变量和立即数时的调用汇编伪代码
int main()
{
int a = 10;
int b = 20;
int ret = sum(a,40);
//push 28H
//mov ecx,dword ptr[ebp-8]
//push ecx
//call sum
return 0;
}
2.4 小结
调用带默认值的函数,并且使用了默认值,至少可以节省一次mov
取值的过程,所以效率上还是有一点差别的。
3. 默认值既可以在定义处给,也可以在声明处给
int sum(int a = 10, int b =10);
int main()
{
int ret = sum();
return 0;
}
int sum(int a, int b) {
return a + b;
}
4. 默认值不管是定义处给,还是声明处给,一个形参变量的默认值只能给一次,只能在一处给,不能既在声明给,又再定义给
正确示范:
int sum(int a, int b =10);
int sum(int a = 20, int b);
int main()
{
int ret = sum();
return 0;
}
int sum(int a, int b) {
return a + b;
}
错误示范:
int sum(int a = 0, int b = 100);
int main()
{
int ret = sum();
return 0;
}
int sum(int a , int b = 100) {
return a + b;
}
即使函数声明可以声明无数次,但是同一个形参变量的只能给一次默认值,并且前提是从左往右给,如果同一个形参变量的默认值声明处给了,定义处就不能重复给了。