C++缺省參數和函數重載

缺省參數

缺省參數感念
缺省參數是聲明或定義函數時爲函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則採用該默認值,否則使用指定的實參比如

#include<iostream>
using namespace std;
void out(int a = 2)//定義函數時指定參數a的默認值爲2
{
	cout<<a<<endl;
}
int main()
{
	out();//調用函數時未傳如參數,則輸入默認值2
	out(10);//傳參,則使用傳入的參數,輸出值爲10
}

如果定義的函數中的變量都賦有默認值,則稱爲全缺省

void fun(int a = 10,int b = 20, int c = 30)
{
	cout << a << b << c << endl;
}

如果定義的函數中部分變量有默認值則稱爲半缺省

void fun(int a;int b = 10, int c = 20)
{
	cout << a << b << c << endl;
}

需注意半缺省參數必須從右向左一次連續賦值,中間不能有間隔。缺省值只能出現在聲明或者定義的地方,不能同時出現

//聲明
void fun(int a, int b, int c);
//定義
void fun(int a = 100, int b = 200, int c = 300)
{
	cout << a << b << c << endl;
}

函數重載

我們知道,在C語言中,定義函數的時候,函數名不能相同,否則就會編譯報錯。但是在C++中,支持函數名相同的函數, 因此也引入了函數重載這個概念
函數重載: 函數名相同,參數不同, 且在同一個作用域, C++支持,C不支持比如

int add(int a,int b)//1
{
	return a + b;
}
int add(double a,double b)//2
{
	return a + b;
}
int add(int a,int b.,int,c)//3
{
	return a + b + c;
}
int add(int a,char b)//4
{
	return a + b;
}
int add(char a,int b)//5
{
	return a + b;
}

第一個函數和第二個函數是參數類型不同構成的重載,第一個函數和第三個函數雖然參數類型相同,但是參數個數不同,也構成了重載,第五個函數和第六個函數是因爲參數類型順序的不同從而構成重載
所以我們能總結出構成重載的條件分別爲參數類型,參數個數和參數順序
那麼爲什麼C和C++對於相同函數名的函數編譯不同呢?
我們知道在C/C++中,一個程序要運行起來,需要經歷以下幾個階段:預處理、編譯、彙編、鏈接
當函數編譯過後,需要鏈接器進行鏈接,比如你在此時鏈接器發現你在調用add函數,但是add沒有地址,於是鏈接器就會到對應的.o文件中找到這個函數,那麼C和C++對函數名稱的修飾是不同的。
C編譯器中,對函數名的修飾中不帶有參數的信息,即使你的參數不同,只要函數名相同,那麼底層對函數名的修飾就是相同的,鏈接器發現多個相同的函數修飾名,這可犯了選擇困難症,也就會出錯
C++編譯器中,對函數名的修飾中,除了函數名的信息外還包含參數的信息,也正因此,即使函數名相同,但後面還有參數的信息,鏈接器在尋找時就會找到對應的函數,也就能成功執行

通過這裏的講解我們就理解了C語言沒辦法支持重載,因爲同名函數沒辦法區分。而C++是通過函數修飾規則來區 分,只要參數不同,修飾出來的名字就不一樣,就支持了重載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章