1. 程式人生 > >帶有預設值函式

帶有預設值函式

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指令的地方將我們

的實參進行儲存,以達到形參使用的目的。