C++-Record14—函数重载及和指针在一起使用的情况(C++对C的扩展)

倾然丶 夕夏残阳落幕 提交于 2020-01-20 12:42:21

目录

函数重载基础

函数重载概念

函数重载的判断标准

函数重载举例

函数重载的调用准则

函数重载的注意事项

函数重载与函数指针结合的情况

总体代码


函数重载应用场景比较多,后面的类的调用中,几乎都会用到。

函数重载基础

函数重载概念

函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。

先举个例子:

int func(int x)
{
	return x;
}
int func(int a, int b)
{
	return a + b;
}
int func(const char* s)
{
	return strlen(s);
}

以上三个函数的函数名称都是,func,但输入的参数个数、类型都不相同, 那这几个函数,就是函数重载。

函数重载的判断标准

函数重载至少满足下面的一个条件:

                                                参数个数不同

                                                参数类型不同

                                                参数顺序不同

这里需要强调的是:函数返回值不是函数重载的判断标准!!!

函数重载举例

void myPrint(int a)
{
	printf("a:%d \n", a);
}

void myPrint(char *p)
{
	printf("%s \n", p);
}

void myPrint(int a, int b)
{
	printf("a:%d ", a);
	printf("b:%d \n", b);
}

返回类型不同,不能作为判断是否是函数重载的标准:

//返回值 不是 判断函数重载的标准 
int myPrint(int a, int b)
{
	printf("a:%d ", a);
	printf("b:%d \n", b);
}

void myPrint(int a, int b)
{
	printf("a:%d ", a);
	printf("b:%d \n", b);
}

 上面这个代码段一编译就会报错:

这也验证了之前的结论。 

再接着看,上面就是就是一个函数的重载的编写方式,下面演示怎样调用函数重载:

void main1601()
{
	
	myPrint(1);
	myPrint("111222233aaaa");
	myPrint(1, 2);
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

当在主函当中运行到对应的重载的函数时,编译器会自动通过比对输入的函数参数与原来设定的多个函数参数进行比对,最相近的,就执行那个。

函数重载的调用准则

就按人正常的思维去进行就可以了,换成官方文字如下:

        将所有同名函数作为候选者,尝试寻找可行的候选函数。

        精确匹配实参:

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

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

        匹配失败:

        最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

        无法匹配所有候选者,函数未定义,编译失败。

函数重载的注意事项

        重载函数在本质上是相互独立的不同函数(静态链编,编译器在编译的过程中,就确定了如何调用)

        重载函数的函数类型是不同的

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

        函数重载是由函数名和参数列表决定的。

        补充:

当函数的默认参数遇上函数重载的时候:

void myfunc(int a, int b, int c = 0)
{
	printf("a:%d b:%d c:%d \n", a, b, c);
}

void myfunc(int a, int b)
{
	printf("a:%d b:%d\n", a, b);
}

void myfunc(int a)
{
	printf("a:%d\n", a);
}
void main1602()
{
	//myfunc(1, 2); //函数调用时,会产生二义性
	myfunc(1);

	
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

运行"myfunc(1, 2)",C++编译器会报错,这是因为编译器无法分清楚到底调用那个函数了,会产生二义性。

另外,如果不明白"void myfunc(int a, int b, int c = 0)"为啥就会让编译器分不清楚了,请翻阅本专利的"C++-Record12",里面对函数扩展有详细记录。

函数重载与函数指针结合的情况

        当使用重载函数名对函数指针进行赋值时,根据重载规则挑选与函数指针参数列表一致的候选者,严格匹配候选者的函数类型与函数指针的函数类型。

本部分只属于语法级别的,属于C++中比较难的部分。

先定义一个函数重载:

void myfunc(int a)
{
	printf("a:%d \n", a);
}

void myfunc(char *p)
{
	printf("%s \n", p);
}


void myfunc(int a, int b)
{
	printf("a:%d \n", a);
}

void myfunc(char *p1, char *p2)
{
	printf("p1:%s ", p1);
	printf("p2:%s \n", p2);
}

下面来定义函数指针,下面分别进行了三个:

声明一个函数类型:

//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ;  //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址

声明一个函数指针类型:

//声明一个函数指针类型 
typedef void (*myPTypeFunc)(int a,int b) ;  //声明了一个指针的数据类型 
//myPTypeFunc fp = NULL;  //通过  函数指针类型 定义了 一个函数指针 ,

定义一个函数指针变量:

//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);

下面写主调函数:

void main()
{
	myPTypeFunc fp; //定义了一个 函数指针 变量  

	fp = myfunc;
	//fp(1);
	
	//myVarPFunc = myfunc;

	fp(1, 2);

	/*
	{
		char buf1[] = "aaaaafff";
		char buf2[] = "bbbb";
		fp(buf1, buf2);
	}
	*/
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

可以运行:

myfunc虽然包含很多函数,多个函数的名字赋给fp,fp执行的时候,会执行严格的匹配。

这块仅作抛砖,具体的引玉,日后再细讲。

总体代码

dm16_函数重载基础.cpp


#include <iostream>
using namespace std;

void myPrint(int a)
{
	printf("a:%d \n", a);
}

void myPrint(char *p)
{
	printf("%s \n", p);
}

void myPrint(int a, int b)
{
	printf("a:%d ", a);
	printf("b:%d \n", b);
}


/*
//返回值 不是 判断函数重载的标准 
int myPrint(int a, int b)
{
	printf("a:%d ", a);
	printf("b:%d \n", b);
}
*/

//1 当函数名和不同的参数搭配时函数的含义不同
//2 函数重载的判断标准
//名称 参数 返回值
//名称相同 参数不一样(个数/类型/)

//3 返回值 不是 判断函数重载的标准 ///

//4 重载函数的调用标准
		//
void main1601()
{
	
	myPrint(1);
	myPrint("111222233aaaa");
	myPrint(1, 2);
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

// 函数重载  和  函数默认参数 在一起

void myfunc(int a, int b, int c = 0)
{
	printf("a:%d b:%d c:%d \n", a, b, c);
}

void myfunc(int a, int b)
{
	printf("a:%d b:%d\n", a, b);
}

void myfunc(int a)
{
	printf("a:%d\n", a);
}
void main1602()
{
	//myfunc(1, 2); //函数调用时,会产生二义性
	myfunc(1);

	
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 dm17_函数重载和函数指针在一起.cpp


#include <iostream>
using namespace std;

void myfunc(int a)
{
	printf("a:%d \n", a);
}

void myfunc(char *p)
{
	printf("%s \n", p);
}


void myfunc(int a, int b)
{
	printf("a:%d \n", a);
}

void myfunc(char *p1, char *p2)
{
	printf("p1:%s ", p1);
	printf("p2:%s \n", p2);
}

//函数指针 基础的语法
//1声明一个函数类型
typedef void (myTypeFunc)(int a,int b) ;  //int
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址

//声明一个函数指针类型 
typedef void (*myPTypeFunc)(int a,int b) ;  //声明了一个指针的数据类型 
//myPTypeFunc fp = NULL;  //通过  函数指针类型 定义了 一个函数指针 ,

//定义一个函数指针 变量
void (*myVarPFunc)(int a, int b);
//

void main()
{
	myPTypeFunc fp; //定义了一个 函数指针 变量  

	fp = myfunc;
	//fp(1);
	
	//myVarPFunc = myfunc;

	fp(1, 2);

	/*
	{
		char buf1[] = "aaaaafff";
		char buf2[] = "bbbb";
		fp(buf1, buf2);
	}
	*/
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!