C和C++的区别一【带有默认值的函数】
一、带有默认值的函数(c++合法)
特点一:在函数的声明或者实现中,只能从右往左给赋值
情况一:int sum(int a,int b = 10);--->合法
情况二:int sum(int a = 10,int b);--->不合法由于在调用函数时sum(.b)这样调用形式不合法;
情况三:int sum(int a,int b = 10);int sum(int a = 10,int b);
这两者结合起来合法,由于在编译时编译器是从上往下编译的,当遇到第一条语句时解析到
给参数b赋了默认值,读到第二条解析到给a赋了默认值;
特点二:在函数声明和实现时不能多次给参数赋值,即使赋同一个值也不行;
如代码:
int sum(int a, int b = 10);
int sum(int a, int b = 10)
{
return a+b;
}
报错提示:说明上述代码不合法,违反了C++语法规定
特点三:假如我们在函数声明或者实现时给一个参数默认值,在调用时又引用了的当前文件中相同参数的赋值,程序会覆盖掉默认值,调用当前的新值,如下列代码所示:
int a = 100;
int b = 200;
int sum(int a = 10, int b = 10)
{
return a+b;
}
int main()
{
int a = 30;
int b = 20;
cout<<"sum="<<sum()<<endl;
cout<<"sum="<<sum(a)<<endl;
//cout<<"sum="<<sum(,b)<<endl;//error
cout<<"sum="<<sum(a,b)<<endl;
return 0;
}
结果:
通过代码中定义的全局的数据(a和b),发现程序运行的时候优先会调用函数内部的同名变量,这也就是我们所说的"就近原则";
分析题:不带参数默认值的函数调用,在转换成汇编语言的时候有以下几步:
(1)代码:
int sum(int a, int b)
{
return a+b;
}
void main()
{
int a = 10;
int b = 20;
sum(a,b);
}
反汇编:
对于带有默认值的函数,以int sum(int a, int b = 20);为例
代码:
int sum(int a, int b = 10)
{
return a+b;
}
void main()
{
int a = 10;
int b = 20;
sum(a);
}
反汇编:
第二种带有默认值的函数与第一种不带默认值的函数相比较,带默认值的函数直接将默认给的值直接压入栈中,不用经过mov先放入寄存器然后压栈,这两者相比来说带有默认值的比不带默认值的要高效,在这里调用一次函数省去一次mov周期,当调用次数较大时,则高效更明显;