带有默认值参数的函数(默认实参)
默认实参作为形参的初始值出现在形参列表中,我们可以为一个或多个形参定义默认值,不过需要注意,一个形参被赋予了默认值,它后面的所有形参都必须给定默认值。
(1)使用默认实参调用函数:如果想使用默认实参,只要在调用时省略该实参,但是只能省略尾部的实参,函数调用时实参按其位置解析,默认实参负责填补函数调用缺少的尾部实参,在设计时要合理设置形参的顺序。
(2)默认实参声明:在个id ing的作用于域中,一个形参只能被赋予一次默认实参,函数的后续生命只能为那些没有默认值的形参添加默认实参,而且该形参的右侧所有形参都必须有默认值。
(3)默认实参初始值:局部变量不能做默认实参,除此之外,只要表达式的类型能转换成形参所需要的类型,该表达式就能作为默认实参
(4)带有默认实参的函数提高了效率。
一次函数调用包含一系列的工作:调用前要先保存寄存器,并在恢复时返回;可能需要拷贝实参;程序转向一个新的位置继续执行。
例一:没有默认实参的函数调用 汇编分析
int sum(int a,int b)
{
return a+b;
}
int main()
{
int a = 10;
//mov dword ptr [ebp-4],0Ah 通过ebp指针的偏移量来访问栈中的局部变量
int b = 20;//mov dword ptr [ebp-8],14h
sum(a,b);
//mov eax,dword ptr [ebp-8] 拷贝ebp-8中的值到eax寄存器
//push eax 将eax入栈
//mov ecx,dword ptr [ebp-4] 拷贝ebp-4中的值到ecx寄存器
//push ecx 将ecx入栈
//call sum (0B4105Fh) 呼叫sum函数
//call指令做了两件事:跳转至sum,并记录下一行指令的地址
return 0;
}
若将代码中sum(a,b)换成sum(10,30),则只有三行汇编指令
int main()
{
sum(10,30);
//push 1Eh
//push 0Ah
//call sum (010105Fh)
return 0;
}
例二:定义一个默认实参
从汇编代码中可以看出,有默认值的参数,少了拷贝实参的过程,因此提高了函数调用的效率。
int sum(int a,int b=20)
{
return a+b;
}
int main()
{
int a = 10;
//mov dword ptr [a],0Ah
//少了将第二个参数mov的过程,提高了效率
sum(a);
//push 14h
//mov eax,dword ptr [a]
//push eax
//call sum (0105105Fh)
sum(20);
//push 14h
//push 14h
//call sum (0105105Fh)
return 0;
}