1. 程式人生 > >C++預設引數函式簡介和使用

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

 of open file
      }
      void Close()
      {
                  file://code of close file
      }
    推而廣之,如下的做法也值得商榷。
      class CString
      {
      private:
            char * pcData;
      public:
            CString(char * pc=NULL);
      };
      CString::CString(char * pc)
      {