標籤:
在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)
//因為沒有實參的建構函式,是預設建構函式,參數指定了預設值的建構函式也是預設建構函式,一個類只能有一個預設建構函式
這裡要說明的是一個類在寫了預設建構函式之後就不會自動產生預設的建構函式,如果你寫的是帶預設參數的建構函式,則其實已經有了預設建構函式
C++預設參數