1. 程式人生 > >函式預設值&&過載&&inline函式

函式預設值&&過載&&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 函式<行內函數>

1inline函式的用法 :呼叫點將程式碼直接展開,編譯階段處理。

2行內函數的優缺點:

  • 優點:安全  效率高
  • 缺點:函式程式碼量太大,以空間換時間

3行內函數的使用建議:

      函式堆疊的開銷 > 函式執行的開銷,建議寫成inline函式

4內斂函式的設計位置:  一般寫在標頭檔案下

5inline函式與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;
}