C++預設引數函式簡介和使用
所謂預設引數,顧名思義,就是在宣告函式的某個引數的時候為之指定一個預設值,在呼叫該函式的時候如果採用該預設值,你就無須指定該引數。預設引數使用主要規則:呼叫時你只能從最後一個引數開始進行省略,換句話說,如果你要省略一個引數,你必須省略它後面所有的引數,即:帶預設值的引數必須放在引數表的最後面。 預設值必須是常量。顯然,這限制了預設引數的資料型別,例如動態陣列和介面型別的預設引數值只能是 nil;至於記錄型別,則根本不能用作預設引數。 預設引數必須通過值參或常參傳遞。
1. 如果函式已經帶有預設引數的函式原型宣告,則在該函式的定義中不允許出現預設值。
2. 一旦為函式的某個引數指定了預設值,則必須為後續引數也定義預設值,從右到左定義預設引數。
void showmessage(char *text,int length=1,int color ) ; //錯color也應定義預設值。
3. 呼叫函式時,如果略去一個引數傳遞,則略去後續所有引數傳遞,呼叫時將引數從左至右,逐一傳遞給行參。
showmessage("hello");
showmessage("hello",5);
showmessage("hello",5,8);
showmessage("hello", ,8); // 錯誤
預設引數的誤區
使用預設引數時應該注意避開下列幾種誤區。
1.濫用預設引數,損害程式碼的結構和可讀性。
void f(bool b=false)
{
if (b)
{
file://code of open file
}
else
{
file://code of close file
}
}
開啟檔案和關閉檔案在實現程式碼上沒有什麼共同點,把兩個屬於同一類別的函式誤認為是實現機制相同,憑空捏造一個引數硬把它們湊在一塊,沒有什麼好處!相反,誰能記得住f(true)代表開啟,f()代表關閉呢?況且,f(false)、f()都可以關閉檔案,如果呼叫者混合使用它們就會增加維護上的困難。這種情況下,寫成兩個獨立的函式,非常清晰。
void Open()
{
file://code
}
void Close()
{
file://code of close file
}
推而廣之,如下的做法也值得商榷。
class CString
{
private:
char * pcData;
public:
CString(char * pc=NULL);
};
CString::CString(char * pc)
{