1、带有默认值的函数
C++可以给函数定义或者声明时给参数赋初值
现在我们学习的C语言是C89标准,没有此功能,但C99标准有。
我们知道形参入栈的时候是按从右向左的顺序依次压入栈的,看下面这段代码:
.cpp文件
#include<stdio.h> int sum(int a,int b); int main() { int a=10; int b=20; sum(a,b); return 0; } int sum(int a,int b) { int temp; temp=a+b; return temp; }
形参入栈时反汇编是这样的:
mov eax,dword ptr[ebp-8];
push eax;
mov ecx,dword ptr[ebp-4];
push ecx;
嗯,形参是从右向左依次入栈。
那么C++为什么使用带默认值的函数?有什么好处呢?
我们修改上面的代码:声明处: int sum(int a,int b=20);
主函数调用处 sum(a);
形参的反汇编是什么: push 14h;
mov eax,dword ptr[ebp-4];
入栈的时候直接把立即数入栈,不用通过寄存器,是不是提高了效率呢!
在主函数中调用sum函数的方式还可以有哪些?
// sum(a,b); 正常的调用
sum(a); 带有默认值的函数,在函数声明处给b赋值,int sum(int a,int b=20);
sum(a,30) 把30赋给b,
sum(a)和sum(a,30)的效率无差别
反汇编形参入栈都是 push 14h
push 1eh
sum(,10),不可以哦,调用的时候要从最后一个开始赋值。因为你调用的函数定义就会变成 int sum(int a=20,int b),这是不允许的,
如果你写成这样:
int sum(int a,int b=20);
int sum(int a=10,int b);
合起来是可以的。
int sum(int a=10,int b);
int sum(int a,int b=20);
不可以
上面的代码我们把声明写在了前面,所以如果你这样写:
int sum(int a,int b)
int main()
{
.....
sum(a);
}
int sum(int a,int b=10)
{
.......
}
也是不可以的,因为函数的编译顺序是从上往下读的,这样给默认值就不可以了。
inline int sum(int a,int b) { return a+b; } int main() { int a=10; int b=20; sum(a,b); return 0; }