函数默认值&&重载&&inline函数

一、函数默认值

c89:  不支持带有默认值的函数        c++99: 支持带有默认值的函数

默认值注意事项:

1、默认函数一般写在声明中

2、自右向左依次赋值(即设置默认值时应该从右至左),因为实参的传递是从前至后。如若不是这样则报错。

函数默认值&&重载&&inline函数_第1张图片

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);    //?Max@@YAHHH@Z
double Max(int a, int b);    //?Max@@YANHH@Z

     (2)一个函数不能既做默认值,又做函数重载。如下图:Sum函数既做了函数重载,又做了默认值,所以报错

函数默认值&&重载&&inline函数_第2张图片

三、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;
}

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(函数默认值&&重载&&inline函数)