在C++中,定義函數時可以給形參指定一個默認的值,這樣調用函數時如果沒有給這個形參賦值(沒有對應的實參),那麼就使用這個默認的值。也就是說,調用函數時可以省略有默認值的參數。如果用戶指定了參數的值,那麼就使用用戶指定的值,否則使用參數的默認值。
所謂默認參數,指的是當函數調用中省略了實參時自動使用的一個值,這個值就是給形參指定的默認值。下面是一個簡單的示例:
#include<iostream>
using namespace std;
//帶默認參數的函數
void func(int n, float b=1.2, char c='@'){
cout<<n<<", "<<b<<", "<<c<<endl;
}
int main(){
//為所有參數傳值
func(10, 3.5, '#');
//為n、b傳值,相當於調用func(20, 9.8, '@')
func(20, 9.8);
//只為n傳值,相當於調用func(30, 1.2, '@')
func(30);
return 0;
}
運行結果:
10, 3.5, #
20, 9.8, @
30, 1.2, @
本例定義了一個帶有默認參數的函數 func(),並在 main() 函數中進行了不同形式的調用。為參數指定默認值非常簡單,直接在形參列表中賦值即可,與定義普通變量的形式類似。
指定了默認參數後,調用函數時就可以省略對應的實參了。
默認參數除了使用數值常量指定,也可以使用表達式指定,例如:
float d = 10.8;
void func(int n, float b=d+2.9, char c='@'){
cout<<n<<", "<<b<<", "<<c<<endl;
}
C++規定,默認參數只能放在形參列表的最後,而且一旦為某個形參指定了默認值,那麼它後面的所有形參都必須有默認值。實參和形參的傳值是從左到右依次匹配的,默認參數的連續性是保證正確傳參的前提。
下面的寫法是正確的:
void func(int a, int b=10, int c=20){ }
void func(int a, int b, int c=20){ }
但這樣寫不可以:
void func(int a, int b=10, int c=20, int d){ }
void func(int a, int b=10, int c, int d=20){ }
默認參數並非編程方面的重大突破,而只是提供了一種便捷的方式。在以後設計類時你將發現,通過使用默認參數,可以減少要定義的析構函數、方法以及方法重載的數量。
本節的例子中,我們在函數定義處指定了默認參數。除了函數定義,你也可以在函數聲明處指定默認參數。不過當出現函數聲明時情況會變得稍微復雜,很多書籍也對這點含糊其辭,我們將在下節《到底在聲明中還是定義中指定默認參數》中詳細講解。