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指令的地方将我们
的实参进行存储,以达到形参使用的目的。