c++基础知识7——函数重载

重载函数

含义:
c语言中,函数如果重名会报错。
c++则引入了函数重载。编译器将所有同名函数作为候选者,精确匹配实参、通过默认参数匹配实参、通过默认类型转换匹配实参等等,寻找到正确的函数;如果匹配到不唯一或匹配不到,则编译错误。

本质:
通过编译后生成的obj文件进行分析,可以看到同名函数在符号表中有不同的标识符,也就是说本质上重载函数是不同的函数。

重载的条件:
1.参数个数不同
2.参数类型不同
3.参数顺序不同
(另外,注意函数返回值“不”作为匹配的依据)

举例:

int func(int a, char *b)
{
	return 0;
}
int func(char *b, int a)
{
	return 1;
}
int main(void)
{
	func(1,"123");	//调用上一个函数
	func("123",1);	//调用下一个函数
}

注意:
当默认参数遇上重载参数可能会出现错误,编译不通过。如:

int func(int a,int b, int c=0)
{
}
int func(int a, int b)
{
}
void main(void)
{
	func(1,2);	//这里编译会提示重载函数模糊,即不知调用哪个函数
}
重载函数与指针

上面说过,函数重载的条件有:函数返回值“不”作为匹配的依据。
但是当重载函数赋值给指针时,函数返回值也作为匹配的依据了(即需要根据指针的返回值类型和参数类型进行匹配,找到正确的重载函数。)。因为c++是强类型语言,当使用指针的时候任何类型都需要严格匹配。

举例1:

int func(int a) {}
int func(char *a) {}
char func(int a) {}
typedef int (*pFUNC)(int a);
void main(void)
{
	pFUNC p = func;	//这里p指针获得的为第一个函数的地址。
	/* 打印重载函数的地址 */
	printf("%p\n", func);	//错误,因为没有上下文,不知道是哪一个重载函数
	printf("%p\n", (int(*)(int))func);	//打印的是第一个重载函数的地址
	printf("%p\n", (char(*)(int))func);	//打印的是第三个重载函数的地址
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值