缺省參數
缺省參數感念
缺省參數是聲明或定義函數時爲函數的參數指定一個默認值。在調用該函數時,如果沒有指定實參則採用該默認值,否則使用指定的實參比如
#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++是通過函數修飾規則來區 分,只要參數不同,修飾出來的名字就不一樣,就支持了重載。