在 C++ 中,宣告一個函數時,可以為函數的引數指定預設值。當呼叫有預設引數值的函數時,可以不寫出引數,這時就相當於以預設值作為引數呼叫該函數。
例如:
void Function1(int x=20); //函數的宣告中,指明引數 x 的預設值是 20
//...
Function1(); //正確的呼叫語句,等效於 Function1(20);
不僅可以用常數,還可以用任何有定義的表示式作為引數的預設值。例如:
int Max(int m, int n);
int a, b;
void Function2(int x, int y=Max(a,b), int z=a*b){
//...
}
Function2(4); //正確,等效於 Function2(4, Max(a,b), a*b);
Function2(4, 9); //正確,等效於 Function2(4,9 , a*b);
Function2(4, 2, 3); //正確
Function2(4, ,3); //錯誤!這樣的寫法不允許,省略的引數一定是最右邊連續的幾個
函數引數的預設值可以像上面的 Function1 那樣寫在宣告函數的地方,也可以像 Function2 那樣寫在定義函數的地方,但是不能在兩個地方都寫。
函數預設引數所帶來的好處是使程式的可擴充性更好,即當程式需要增加新功能時,改動可以盡可能少。
試想下面這種情況。一個即將編寫完成的繪圖程式,其中有一個畫圓的函數 Circle,畫出來的圓都是黑色的,這時希望增加畫彩色圓的功能,於是就需要在 Circle 函數中增加一個 int 型的 color 引數,用來表示顏色。
但是原來的程式中可能大多數呼叫 Circle 函數的地方依然只是畫個黑色的圓就可以了,只有少數幾個地方需要改成畫彩色的圓。此時,如果要找出所有呼叫 Circle 函數的語句並補上顏色引數,會十分煩瑣。
而有了函數引數預設值的機制,則只需為 Circle 函數的新引數指定預設值 0(假定 0 代表黑色),然後找出少數幾個呼叫 Circle 函數畫彩色圓的地方,補上顏色引數即可。
實踐中這種情況 是經常發生的。