带有默认值函数

c++中经常会看到带有默认值的函数像这样形式:

void fun1(int a,);
void fun2(int a = 10);

一、这跟我们普通函数有一定不同,代码示例:

void fun1(int a){}
void fun2(int a = 10){}
int main()
{
	fun1(10);
	fun2();
	fun2(20);
	return 0;
}
1.普通函数在调用时就必须有相应的实参传递;
fun1(10);
2.而带有默认值的函数调用时
fun2();		我们不传递参数,那么编译器就会使用我们的默认值
fun2(20);	使用传递的20
3.当指定某一个参数有默认值时,那么位于它右边的参数都必须有默认值(既,它必须位于形参列表队尾)
void test(int a, int b = 10, int c = 20)	//正确
void test1(int a, int b = 10, int c)		//错误

二、我们都知道在参数传递时,汇编上会有类似push这样的操作。如fun1:

	fun1(10);
009F1A1E  push        0Ah  					//实参传递
009F1A20  call        fun1 (09F11DBh)  
009F1A25  add         esp,4  
	//fun2();
	//fun2(20);
	return 0;
009F1A28  xor         eax,eax  

那么带有默认值,而我们没有给参数是什么样子:

	//fun1(10);
	fun2();
00081A1E  push        1Eh  					//很明显我们没有传递参数,但还是有push操作
00081A20  call        fun2 (0810A5h)  
00081A25  add         esp,4  
	//fun2(20);
	return 0;
00081A28  xor         eax,eax  
4.虽然我们没有传递参数,但是编译器还是会生成push指令把参数进行入栈操作。
所以,从根本上讲跟普通函数没什么效率差别。

声明:

这里只是采用int类型进行测试,实质上当我们传入的是较大的class时,生成的不是push指令。

因为push需要用到寄存器,而寄存器又不能存储下class。因此会在本应该是push指令的地方将我们

的实参进行存储,以达到形参使用的目的。

猜你喜欢

转载自blog.csdn.net/Jorgain/article/details/84297415