簡介定義
C++默認參數指的是當函數調用中省略了實參時自動使用的一個值。寫法如下:
void foo(int a = 1)
{
}
void foo(int a, int b=1, int c=1)
{
}
默認參數有兩個規則,
- 規則一:從第一個出現默認參數的參數開始,後面的參數必須也指定默認參數
void foo(int a=1, int b, int c=1); //錯誤
void foo(int a=1, int b, int c); //錯誤
void foo(int a, int b, int c=1); //正確
void foo(int a, int b=1, int c=1); //正確
void foo(int a=1, int b=1, int c=1); //正確
- 規則二:聲明和定義分開時,僅聲明處做初始賦值動作
void foo(int a = 1);
void foo(int a)
{
}
分析原理
在我的理解中,C++的各種特性基本是靠編譯器隱藏了很多特殊操作,來實現這些特性,諸如面向對象等等。實際純C語言結合一些編譯器選項,完全可以實現C++的絕大多數效果。所以直接看彙編,扒開編譯器隱藏的細節,到彙編這一層基本原形必露,藉助Compiler Explorer:
對比發現有沒有默認參數兩者彙編一模一樣,那爲什麼可以實現不同的效果呢?再看下如果調用一下這2個函數:
可以看到如果不給默認參數賦值,則在調用處會由編譯器自動給參數賦值爲默認值,如果你指定了參數值,就用你指定的。也就是說編譯器玩了個花招而已,並沒多牛逼。
瞭解了實現原理後,再分析下爲什麼有上面的兩個規則約束。假設帶默認參數的函數可以這樣定義:
int foo(int a = 1, int c);
按照它的特性,可以在調用處以這幾種形式調用:
foo(1);//本意是a使用默認值a=1,c使用傳遞的值c=1
foo(1);