函数的升级(下)

重载的概念:同一个标识符在不同的标识符有不同的含义。

c++中的函数重载:

用同一个函数名定义不同的函数;当函数名和不同的参数搭配时函数的意义不同;

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

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

1.函数参数类型不同;

2.函数参数个数不同;

3.函数参数顺序不同;

当函数默认参数遇上函数重载时,极易产生二义性。因此应当避免同时使用函数默认参数和重载,避免二义性是程序设计的基本准则。

int func(int a, int b, int c = 0)
{
    return a * b * c;
}
int func(int a, int b)
{
    return a + b;
}
int main(int argc, char *argv[])
{
    int c = 0;
    c = func(1, 2); // 存在二义性,调用失败,编译不能通过 
    printf("c = %d\n", c);
    printf("Press enter to continue ...");
    getchar();
    return 0;
}

编译器调用重载函数的准则:

将所有同名函数作为候选者,尝试寻找可行的候选函数,精确匹配实参形参。若匹配失败,则可能是寻找到的可候选函数不唯一,则出现二义性,编译失败。另外,可能无法匹配所有候选者,函数未定义,匹配失败。

函数重载的注意事项:

重载在本质上是相互独立的不同函数,重载函数的类型是不同的,重载返回值不能作为重载函数的依据,函数重载是由函数名和参数表列组成的。

函数重载与函数指针:

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

int func(int x) // int(int a)
{
    return x;
}
int func(int a, int b)
{
    return a + b;
}
typedef int(*PFUNC)(int a); // int(int a)
int main(int argc, char *argv[])
{
    int c = 0;
    PFUNC p = func;
    c = p(1);//调用func(1)  
    printf("c = %d\n", c);  
    printf("Press enter to continue ...");
    getchar();
    return 0;
}

c++和c的相互调用:

在实际项目工程中,融合c++和c代码是不可避免的。虽然c++编译器能够兼容c的编译方式,但c++编译器会优先使用c++的编译方式编译。利用extern关键字让c++编译器对代码进行c方式编译。

——cplusplus是c++标准的内置宏定义,它的意义在于让c代码通过c编译器的编译,也可以在c++中以c方式编译

#ifdef __cplusplus
extern "C" {
#endif


//函数声明或函数定义

#ifdef __cplusplus
}
#endif

注意,c++编译器不能以c方式编译多个重载函数

#ifdef __cplusplus
extern "C" {
#endif
int func(int a, int b)
{
    return a + b;
}
int func(const char* s)
{
    return strlen(s);
}
#ifdef __cplusplus
}
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值