預設參數
大家知道什麼是備胎嗎?
你有喜歡過一個人嗎?喜歡到願意為Ta做任何事?
你有喜歡過一個人嗎?Ta深知你的心意,卻沒有接受你?
你有喜歡過一個人嗎?即使Ta沒有接受你,你仍毫無怨言地鞍前馬後照顧Ta?
你有喜歡過一個人嗎?哪怕Ta已經心有所屬,你仍心甘情願的等那個未知的可能?
不知道有多少人做着别人的備胎,就算被消耗也強裝笑臉。就像歌裡唱的那樣“我給你的愛一直很安靜,來交換你偶爾給的關心。明明是三個人的電影,我卻始終不能有姓名。”
C++中也有備胎–預設參數
預設參數概念
預設參數是聲明或定義函數時為函數的參數指定一個預設值。在調用該函數時,如果沒有指定實參則采用該預設值,否則使用指定的實參。
//int a=0;就是預設參數
#include<iostream>
using namespace std;
//預設參數
void TestFunc(int a = 0) //int a=0;就是預設參數
{
cout << a << endl;
}
int main()
{
TestFunc(10); // 傳參時,使用指定的實參
TestFunc(); //沒有傳參時,使用參數的預設值
return 0;
}
當調用函數時,給函數傳實參,那麼形參的值,就是所傳的實參。若是沒有傳實參,形參的值就是預設值,即給定的預設參數。例
預設參數的分類
全預設參數
函數的每個參數都賦予初值,叫全預設參數
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
TestFunc(1, 2, 3);
TestFunc();
TestFunc(1);
TestFunc(1,2);
return 0;
}
結果顯示
半預設參數
函數的部分參數都賦予初值,叫半預設參數
#include<iostream>
using namespace std;
//半預設參數
void TestFunc(int a, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
TestFunc(1);
TestFunc(1, 2);
TestFunc(1, 2, 3);
return 0;
}
結果顯示
注意
- 半預設參數必須從右往左依次來給出,不能間隔着給
- 預設參數不能在函數聲明和定義中同時出現,若是同時出現,所賦予的初值不同,編譯器會報錯。一般在聲明時給出預設參數。
- 預設值必須是常量或者全局變量
- C語言不支援(編譯器不支援)
預設參數的意義
調用時更靈活,可根據實際情況給出初值。
假設建立一個棧,初始化時該開辟多大的空間呢?
如果資料量比較大,初始化空間比較小, 可能要多次開辟空間,增加資源消耗。
如果資料量比較小,初始化空間比較大,有浪費資源。
如果使用預設參數,就可以自定義初始化空間大小,也可以預設預設值。
void StackInit(struct Stack* ps, int InitCapacity = 4)
{
ps->a = (int*)malloc(sizeof(int) * InitCapacity);
ps->size = 0;
ps->capacity = InitCapacity;
}
int main()
{
struct Stack st1;
// 假設我知道棧裡面至少要存100個資料
StackInit(&st1, 100);
struct Stack st2;
// 假設我知道棧裡面最多要存10個資料
StackInit(&st2, 10);
struct Stack st3;
// 假設我不知道棧裡面可能存多少資料
StackInit(&st2);
return 0;
}