C++学习:函数重载

什么是函数重载(Overload)

重载:同一个标识符在不同的上下文有不同的意义。重载是C语言与C++之间质的区别,C语言中所有的函数名都不允许同名,也就是说在C语言中函数名是区分不同函数的标识,但是在C++中可不是这么玩的,在C++中同一个函数名,可以表示不同的函数。

重载日常生活中的表现

在生活中常常有这种情况,同一个字,在不同的场景,表达的意思是不一样的,比如:

明:明亮的明,与明天的明

洗:洗脑的洗,与洗衣服的洗

可:可爱的可,与可是的可

重载函数的表现形式以及条件

以下三个条件,只要满足其中的一个就表示重载函数:

1、函数的参数个数不同;

2、函数参数的类型不同;

3、函数参数的顺序不同

程序实例1:函数名与不同的参数搭配时,函数的含义是不一样的,表示不同的函数

#include
#include


int func(int x)
{
	return x;
}


int func(int a, int b)
{
	return a + b;
}


int func(const char* s)
{
	return strlen(s);
}


int main()
{
	printf("%d\n", func(3)); //输出3
	printf("%d\n", func(4,5));//输出9
	printf("%d\n", func("helloworld!"));//输出11

	return 0;
}

编译器调用重载函数的规则

1、将所有同名函数作为候选项;

2、尝试寻找可行的候选参数

        精确匹配实参

        通过默认参数能够匹配实参

        通过默认类型转换匹配实参

3、匹配失败的情况

        最终的候选函数有两个及以上,就编译失败;

        没有候选函数,编译失败。

函数重载的注意事项

1、函数重载是由函数名参数列表决定的

2、重载函数本质上是相互独立的不同函数;

3、重载函数的函数类型是不一样的;

4、函数的返回值不能作为函数重载的依据

函数重载的本质分析

程序实例2:函数重载的本质分析

#include
#include

//函数类型:int(int, int, int)
int add(int a, int b, int c)
{
	return a + b + c;
}

//函数类型:int(int,int)
int add(int a, int b)
{
	return a + b;
}


int main()
{
	printf("%d\n", add(1, 2)); //调用int add(int a, int b)
	printf("%p\n",(int(*)(int, int))add);//打印函数的入口地址

	printf("\n");

	printf("%d\n", add(1, 2, 3));//调用int add(int a, int b, int c)
	printf("%p\n", (int(*)(int, int, int))add);//打印函数的入口地址

	return 0;
}

输出结果:

3
00A513CF

6
00A513CA

从打印的函数地址来看,函数add(int a, int b, int c)与函数add(int a, int b)的地址是不一样的,表示不同的函数。

重载函数与函数指针

将重载函数的函数名赋值给函数指针时:

        根据重载规则挑选与函数指针参数列表一致的候选者;

        严格匹配候选者的函数类型和函数指针的函数类型;

程序实例3:根据函数指针的参数列表去对应重载函数

#include
#include


int func(int x)
{
	return x;
}


int func(int a, int b)
{
	return a + b;
}


int func(const char* s)
{
	return strlen(s);
}

typedef int(*PFUNC) (int a);


int main()
{
	int c = 0;

	PFUNC p = func;

	c = p(2); //函数指针去匹配函数

	printf("c = %d\n",c);

	return 0;
}

输出结果:

c = 2

从输出的结果知道p(2),相当于调用了函数int func(int x)。

你可能感兴趣的:(C++,c++,学习,开发语言)