一、函式引數的默認值
C++語言規定,提供默認值時必須按從右至左的順序提供,即有默認值的形參必須在形參串列的最后,如果有某個形參沒有默認值,則它左側的所有形參都不能有默認值,呼叫函式時,主調函式的實參與被調函式的形參按從左至右的順序進行匹配對應,
// 為引數a,b,c分別設定了默認值11,22與33 void func(int a=11,int b=22,int c=33){ cout<<"a=" <<a<< ",b="<<b<<",c="<<c<<endl; } int main() { func(); //呼叫時缺少了3個實參,將使用定義中的3個引數默認值 func(55); //呼叫時缺少了后2個實參,將使用定義中的后2個引數默認值 func(77,99); //呼叫時缺少了最后1個實參,將使用定義中的最后1個引數默認值 func(8,88,888); //呼叫時實參完備,將不使用定義中的任何引數默認值 return 0; }

二、函式的呼叫
假設給出如下的函式宣告:
void func(int a,int b=2,int c=3);
則下列函式呼叫中哪些是正確的?請解釋原因,
//正確
func(1,22,333);
//錯誤因為第一個引數沒有默認值
func();
//正確
func(10,20);
//錯誤的,呼叫時給出的實參應該是連續排列的
func(5,,9);
函式的原型:
在編譯器遇到對特定函式的呼叫之前,它必須已經知道有關函式的某些內容,特別是,它必須知道函式使用的形參的數量、每個形參的型別以及函式的回傳型別,通常,這可以通過在程式中包含一個函式原型來實作,當然,main 函式除外,它永遠不需要原型,因為它是程式的起點,
三、參考和函式引數的傳遞
1. 參考的定義
參考相當于給變數起了一個別名,變數對應于某個記憶體地址,如果給某個變數起了別名(不需要給它另開辟記憶體單元),相當于變數和這個參考都對應到同一地址,程式中使用哪個名字都是允許的,在C++中,
C++中“參考”的定義格式:型別名 &參考名=同型別的某變數名;
int main() { int num=100; int &num_r=num; cout<<" &num_r=" <<num_r<< ",numb="<<num<<endl; // &num_r=100,numb=100 num=101; cout<<" &num_r=" <<num_r<< ",numb="<<num<<endl;// &num_r=101,numb=101 num_r=102; cout<<" &num_r=" <<num_r<< ",numb="<<num<<endl;// &num_r=102,numb=102 return 0; }
2、應用資料作為函式引數
在程式中不僅能定義變數的參考,還可以將參考用在函式中,參考既可以作為函式的引數使用,也可以作為函式的回傳值使用,
int& add(int &a){ a++; return a; } int main(){ int mun=8; int &a=mun; int &m=add(a); cout << "num=" << mun <<endl; //num=9 m++; cout << "num=" << mun <<endl; //num=10 return 0; }
在C++中,函式呼叫時引數的傳遞有兩種方式:傳值和傳參考,
- 傳值,實際上是傳遞物件的值,傳參考是傳遞物件的首地址值,如果函式的形參不是參考,那么呼叫時實參傳遞給形參通常采用的是傳值的方式,即將實參的值拷貝給形參,在函式執行程序中,都是對這個拷貝進行操作的,函式執行完畢回傳后,形參的值并不拷貝回實參,也就是說函式內部對形參的改變不會影響到函式外實參的值,
- 如果函式的形參是參考,則呼叫時實參傳遞給形參采用的是傳參考的方式,函式呼叫時,實參物件名傳遞給形參物件名,形參物件名就成為實參物件名的別名,即形參是對應實參的參考,它們是等價的,代表同一個物件,也可以看作是將實參的地址傳遞給了形參,在函式內部對形參的操作,都是對這個地址的內容進行的,相當于對實參的值進行了操作,所以當函式執行完畢回傳后,實參的變化被保留下來,
//傳值 a、b值互換 void SwapValue(int a,int b){ int tmp; tmp=a; a=b; b=tmp; cout<<"SwapValue=https://www.cnblogs.com/jalja365/p/>a="<<a<<",b="<<b<<endl;//SwapValue=https://www.cnblogs.com/jalja365/p/>a=20,b=10 } //傳參考 a、b值互換 void SwapRef(int & a,int & b){ int tmp; tmp=a; a=b; b=tmp; cout<<"SwapRef=>a="<<a<<",b="<<b<<endl;//SwapRef=>a=20,b=10 } int main(){ int a=10,b=20; cout<<"a="<<a<<",b="<<b<<endl<<endl;//a=10,b=20 SwapValue(a,b); cout<<"SwapValue() a="<<a<<",b="<<b<<endl<<endl;//SwapValue() a=10,b=20 a=10; b=20; SwapRef(a,b); cout<<"SwapRef() a="<<a<<",b="<<b<<endl<<endl;//SwapRef() a=20,b=10 return 0; }
四、行內函式:inline
1、為了避免這種頻繁的函式呼叫與回傳,C++語言引入了行內函式的概念,使用行內函式,編譯器在編譯時并不生成函式呼叫,而是將程式中出現的每一個行內函式的呼叫運算式直接用該行內函式的函式體進行替換,就像整個函式體在呼叫處被重寫了一遍一樣,很顯然,使用行內函式會使最終可執行程式的體積增大,這是以空間消耗節省時間開銷,
2、行內函式應該定義在前,呼叫在后,定義時只需在函式頭回傳值型別的前面加上關鍵字inline,
3、行內函式主要應用于代碼量少的函式,頻繁呼叫;
4、如果函式體中有回圈陳述句和switch陳述句則通常不定義為行內函式,
//inline 定義函式 inline int add(int a){ return a+a; } int main(){ int a=10; a=add(a); cout <<"a:="<<a <<endl; return 0; }
五、函式的多載
所謂函式多載,是指在程式的同一范圍內宣告幾個功能類似的同名函式,實作函式的多載必須滿足下列條件之一:
- 引數表中對應的引數型別不同,
- 引數表中引數個數不同,
如果函式引數表中不同型別引數的次序不同,也符合上面所說的條件,要注意的是,回傳值型別不能用來區分函式,也就是說,如果兩個函式的名字和引數表都是一樣的,僅僅是回傳值型別不同,則這兩個函式不是多載的,編譯器認為它們是重復定義,編譯時會報錯,
int add(int a){ return a+a; } int add(int a,int b){ return a+b; } int add(int a, double b){ return a+b; } double add(double a, double b){ return a+b; } int main(){ int a=10; a=add(a); cout <<"a:="<<a <<endl; a=add(a,a); cout <<"a:="<<a <<endl; a=add(a,10.1); cout <<"a:="<<a <<endl; a=add(10.4,10.6); cout <<"a:="<<a <<endl; return 0; }
為什么 不能使用回傳值型別作為多載:多載發生在編譯階段,而回傳值是運行階段;如果僅僅是回傳值型別不同,編譯器是無法區分具體呼叫哪個函式的
傳值引數與參考引數也不能區分函式,無法多載:
void print(double); void print(double&);//錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24302.html
標籤:C++
上一篇:C++基礎之變數
