函式預設值&&過載&&inline函式
一、函式預設值
c89: 不支援帶有預設值的函式 c++99: 支援帶有預設值的函式
預設值注意事項:
1、預設函式一般寫在宣告中
2、自右向左依次賦值(即設定預設值時應該從右至左),因為實參的傳遞是從前至後。如若不是這樣則報錯。
3、預設值只能賦一次
4、預設值的限制:
- 不能賦區域性變數
- 能使用全域性變數和靜態變數
- 可以是函式呼叫
int Compare(int a, int b, int c = 70);//c=70為函式預設值 { if (a > b && b > c) { return a; } else if (b > a && a > c) { return b; } else { return c; } } int main() { int rt =Compare(30,50);//如果沒有給定第三個引數,則系統呼叫預設值70,返回值為70 int rt =Compare(30,50,60);//如果給定預設值,則傳入的引數將預設值覆蓋,返回值為60 printf("%d\n" ,rt); return 0; }
設定多個預設值時;如下:
int Compare(int a, int b ,int c=70);//設定多個預設值時預設值自右向左賦值,不能跳過b,給a c賦值 int Compare(int a, int b =80,int c); int Compare(int a=20, int b ,int c) { if (a > b && b > c) { return a; } else if (b > a && a > c||b>c && c>a) { return b; } else { return c; } } int main() { int rt =Compare();//返回值為80 printf("%d\n" ,rt); return 0; }
二、函式的過載
C++允許在同一個作用域內用同一個函式名定義多個函式,這些函式的引數個數和引數型別不相同,這些同名的函式用來實現不同的功能。這就是函式的過載,即一個函式名多用。
int Max(int a, int b)//以下四個函式均為函式名相同,引數型別不同,為函式的過載 { return a > b ? a : b; } double Max(double a, double b) { return a > b ? a : b; } char Max(char a, char b) { return a > b ? a : b; } char* Max(char* a, char* b) { return strcmp(a, b) > 0 ? a : b; } int main() { printf("%d\n",Max(10, 20)); printf("%lf\n",Max(2.2, 3.3)); printf("%s\n",Max("hello", "world")); printf("%c\n",Max('a', 'b')); return 0; }
函式過載的三要素:
- 同作用域
- 同名
- 引數列表不同
C++函式符號生成的規則:返回值 函式名稱 引數列表
函式的過載決議:規則對過載作了支援,但過載並不依賴於規則
函式過載注意事項:
(1)函式名相同,引數列表相同,返回值不同,不能構成函式過載(如果只有返回值不同,則不構成過載,過載不依賴返回值 ) 如下:
int Max(int a, int b); //[email protected]@[email protected]
double Max(int a, int b); //[email protected]@[email protected]
(2)一個函式不能既做預設值,又做函式過載。如下圖:Sum函式既做了函式過載,又做了預設值,所以報錯
三、inline 函式<行內函數>
1、inline函式的用法 :呼叫點將程式碼直接展開,編譯階段處理。
2、行內函數的優缺點:
- 優點:安全 效率高
- 缺點:函式程式碼量太大,以空間換時間
3、行內函數的使用建議:
函式堆疊的開銷 > 函式執行的開銷,建議寫成inline函式
4、內斂函式的設計位置: 一般寫在標頭檔案下
5、inline函式與static函式的區別:
static:區域性的,有開棧、清棧的過程,有符號生成
inline:無開棧 、清棧,沒有符號生成。
6、行內函數的注意事項:
- inline是給編譯器的建議
- 針對遞迴、while、switch無效
- 行內函數在Debug版本不生效,realease下生效
- 內斂是基於實現的(即定義點),不是基於宣告
簡單inline函式程式碼實現:
inline void Print(int arr[], int len)//編譯階段處理inline函式
{
if (len < 1)
{
return;
}
Print(arr, len - 1);
printf("%d ", arr[len - 1]);
}
int main()
{
int rt = Sum(10, 20);//int rt = 10 + 20;
int arr[] = { 13, 21, 3, 214, 3 };
int len = sizeof(arr) / sizeof(arr[0]);
Print(arr, len);
return 0;
}