一,內聯函數
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();編譯器無法判斷是調用的第一個還是第二個,存在二義性,因此會報錯。