天天看點

C++中的“備胎”-預設參數

預設參數

大家知道什麼是備胎嗎?

你有喜歡過一個人嗎?喜歡到願意為Ta做任何事?

你有喜歡過一個人嗎?Ta深知你的心意,卻沒有接受你?

你有喜歡過一個人嗎?即使Ta沒有接受你,你仍毫無怨言地鞍前馬後照顧Ta?

你有喜歡過一個人嗎?哪怕Ta已經心有所屬,你仍心甘情願的等那個未知的可能?

不知道有多少人做着别人的備胎,就算被消耗也強裝笑臉。就像歌裡唱的那樣“我給你的愛一直很安靜,來交換你偶爾給的關心。明明是三個人的電影,我卻始終不能有姓名。”

C++中的“備胎”-預設參數

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;
}
           

當調用函數時,給函數傳實參,那麼形參的值,就是所傳的實參。若是沒有傳實參,形參的值就是預設值,即給定的預設參數。例

C++中的“備胎”-預設參數

預設參數的分類

全預設參數

函數的每個參數都賦予初值,叫全預設參數

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;
}
           

結果顯示

C++中的“備胎”-預設參數

半預設參數

函數的部分參數都賦予初值,叫半預設參數

#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++中的“備胎”-預設參數

注意

  1. 半預設參數必須從右往左依次來給出,不能間隔着給
  2. 預設參數不能在函數聲明和定義中同時出現,若是同時出現,所賦予的初值不同,編譯器會報錯。一般在聲明時給出預設參數。
  3. 預設值必須是常量或者全局變量
  4. 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;
}
           

繼續閱讀