C++学习:函数重载与匹配

本文探讨了C++中函数重载的实现机制及其潜在问题,包括编译器如何通过namemangling处理重载,避免默认参数导致的歧义,以及函数指针在重载函数中的正确使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中,函数重载一直是一个常用且重要的东西,但其中也是有很多坑。

编译器怎么对待函数重载

实际上,在g++处理函数重载的时候,假设有下面两个函数

void fun(int a,int b)
{
    //...
}

void fun(int a,char b)
{
    //...
}

很明显这是两个重载的函数,C++利用一种叫name mangling的技术,经过编译器处理后,实际上是产生了两个函数,比如分别是fun_ii(),fun_ic()两个函数,也就是在实际经过编译器后,他最终产生的仍然是多个函数,再根据调用时传入的参数列表进行选择,因此,由于编译器的这种处理方法,在实际使用过程中就产生了很多坑。

不要有默认参数

void fun(int a,int b,int c = 100)
{
    //...
}

void fun(int a,int b)
{
    //...
}

比如这样的处理方式就不可取,因为编译器在分析的时候会产生歧义,因而我们在重载函数的时候不要带默认参数。

函数的返回值

在c++中,函数的返回值是不构成函数重载的条件的,因此返回值不同不可以构成重载,我们在编译过程中,编译器就会发现并且报错

函数的重定义

那如果我想对一个已有的重载函数重定义该怎么办呢,那就需要像C一样,令函数的返回值、函数参数列表(参数的个数、参数的类型、参数的顺序)相同,即可作为函数的重定义

函数指针

我们在上面提到,编译器对待函数重载是 将其产生多个函数,因此我们在利用函数指针的时候就要注意,函数指针定义时的参数列表不同,是不能够匹配的

int func(int,int,int);
int func(int,int);

int(*fp)(int,int)=NULL;
fp = func;//指向int func(int,int)

比如上述的函数指针fp,我们在使用他的过程中,就只能传入两个参数,因为在经过编译器处理后,它实际指向的就是int func(int,int),如果传入三个参数,就会报错参数太多,也就是函数指针并不进行匹配,因此在使用函数指针时要注意他指向了那个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值