在C++中,可以為參數指定默認值。在函數調用時沒有指定與形參相對應的實參時, 就自動使用默認參數。
默認參數的語法與使用:
(1)在函數聲明或定義時,直接對參數賦值。這就是默認參數;
(2)在函數調用時,省略部分或全部參數。這時可以用默認參數來代替。
注意:
(1)默認參數只可在函數聲明中設定一次。只有在沒有函數聲明時,才可以在函數定義中設定。(#add ,此句意為存在函數聲明和定義兩部分的時候。驗證表明有這個限制,可以隨便,但出於規范,在聲明中指定)
(2)如果一個參數設定了缺省值時,其右邊的參數都要有缺省值。(#add 這是定義時,類的成員函數的參數表在聲明時默認參數位於參數表右部, 使用時該怎樣待總結)
如:int mal(int a, int b=3, int c=6, int d=8) 正確,按從右到左順序設定默認值。
int mal(int a=6, int b=3, int c=5, int d) 錯誤,未按照從右到左設定默認值。c設定缺省值了,而其右邊的d沒有缺省值。
(3)默認參數調用時,則遵循參數調用順序,自左到右逐個調用。這一點要與第(2)分清楚,不要混淆。(#add 神馬意思啊? 暫理解為兩個默認參數之間的參數必須賦缺省值, 錯,意為調用函數時,從左至右第一個實參即為第一個形參的實參,依此類推)
如:void mal(int a, int b=3, int c=5); //默認參數
mal(3, 8, 9 ); //調用時有指定參數,則不使用默認參數
mal(3, 5); //調用時只指定兩個參數,按從左到右順序調用,相當於mal(3,5,5);
mal(3); //調用時只指定1個參數,按從左到右順序調用,相當於mal(5,3,5);
mal( ); //錯誤,因為a沒有默認值
mal(3, , 9) //錯誤,應按從左到右順序逐個調用
再如: void mal(int a=8, int b=3, int c=5); //默認參數
mal( ); //正確,調用所有默認參數,相當於mal(8,3,5);
(4)默認值可以是全局變量、全局常量,甚至是一個函數。但不可以是局部變量。因為默認參數的調用是在編譯時確定的,而局部變量位置與默認值在編譯時無法確定。
最典型的就是在帶默認參數的構造函數:
比如說你定義了一個class A; A有兩個private數據成員int a;和int b; 如果不是用默認的構造函數的話代碼如下:
A(); //不帶參數的構造函數
A(int a,int b);//帶參數的構造函數
如果你在新建對象時,如初始化
A a1; //初始化調用A();
A a2(3,4); //賦值調用A(int a,int b);
而如果使用帶默認參數的構造函數時就不需要不帶參數的構造函數了(使用帶默認參數的構造函數就相當於上面兩個構造函數都寫);如下:
A(int a=0,int b=0);
則不需要在寫出不帶參數的構造函數了;因為你如果這樣定義對象:
A a1; //調用的還是A(inta=0,int b=0)因為編譯器就不再產生默認的構造函數A();而是直接調用A(int a=0,int b=0)
//因為沒有實參的構造函數,是默認構造函數,參數指定了默認值的構造函數也是默認構造函數,一個類只能有一個默認構造函數
這里要說明的是一個類在寫了默認構造函數之后就不會自動生成默認的構造函數,如果你寫的是帶默認參數的構造函數,則其實已經有了默認構造函數
