一,內聯函數
1.內聯函數的概念
C++中的const常量可以用來代替宏常數的定義,例如:用const int a = 10來替換# define a 10。那麼C++中是否有什麼解決方案來替代宏代碼片段呢?C++中推薦使用內聯函數代替宏代碼片段,C++中使用inline關鍵字聲明內聯函數。注意:內聯函數聲明時inline關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略內聯請求。
2.內聯函數示例
# include<iostream> using namespace std; /* 宏定義函數方式 */ # define FUN1(a,b) ((a)<(b)?(a):(b)) /* 內聯定義函數方式 */ inline int FUN2(int a,int b) { return a < b ? a : b; } int main() { int a = 1; int b = 3; // 宏定義方式的時候是在預編譯階段直接替換,++a<b?++a:b,因此此時返回的c是3(執行了兩次++) // int c = FUN1(++a, b); // 內聯函數方式是在編譯階段將函數體直接插入到調用的地方,最終生成的代碼是沒有函數定義的 int c = FUN2(++a, b); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
3.內聯函數的說明
二,默認參數
1.默認參數實例
C++中可以在函數定義時為函數參數設置默認值,當在進行函數調用的時候,如果沒有指定這個參數的值,編譯器會自動用默認值替換。
# include<iostream> using namespace std; void print(int a = 3) { cout << "a = " << a << endl; } int main() { // 默認參數 打印結果: a = 3 print(); // 傳遞函數參數 打印結果: a = 5 print(5); return 0; }
2.默認參數的規則
當函數的參數中使用了默認參數,那麼該參數後面的參數只能為默認參數,而不能為普通參數(因為在函數調用的時候,無法明確要傳遞的參數)。
三,占位參數
1.函數占位參數實例
C++中占位參數只有參數類型的聲明,而沒有參數的名稱,一般情況下,在函數體內無法使用占位參數。
# include<iostream> using namespace std; /* 函數占位參數 */ void test(int a, int b, int) { cout << "a = " << a << ",b = " << b << endl; } int main() { // 調用含有占位參數的函數時,函數參數個數必須匹配,必須用3個參數而不是2個 test(1, 2, 3); return 0; }
2.占位參數和默認參數結合使用
如果占位參數和默認參數結合使用,則在函數調用的時候可以傳遞該占位參數也可以不傳遞該占位的值。其意義是為了以後程序的拓展留下線索,同時兼容C語言的一些不規范語法。
# include<iostream> using namespace std; /* 函數占位參數和默認參數結合 */ void test(int a, int b, int = 3) { cout << "a = " << a << ",b = " << b << endl; } int main() { // 當函數占位參數和函數默認參數結合在一起的時候,我們調用函數的參數列表就可以傳2個或者3個參數了 test(1, 2); test(1, 2, 3); return 0; }
四,函數的重載
1.函數重載的概念
所謂的函數重載就是用同一個函數名,定義不同的函數。
2.函數重載的規則
1.函數的名稱必須一致。
2.函數的參數個數不同。
3.函數參數的類型不同。
4.函數參數的類型順序不一致。
3.函數的返回值是否是函數重載的判斷標准?
答案是否,函數的返回值不能夠作為函數重載的標准,例如我們定義一個簡單的函數void fun()和int fun(),當我在main()函數中調用fun();編譯器無法判斷是調用的第一個還是第二個,存在二義性,因此會報錯。