帶有預設值函式
阿新 • • 發佈:2018-11-20
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指令的地方將我們
的實參進行儲存,以達到形參使用的目的。