C和C++的区别一【带有默认值的函数】

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周期,当调用次数较大时,则高效更明显;

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页