您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记6——函数重载分析

2018-03-06 09:39 302 查看

C++中的函数重载

用同一个函数名定义不同的函数

当函数名和不同的参数搭配时函数意义不同

/*
测试代码
*/
#include <stdio.h>
#include <string.h>

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("D.T.Software"));    // 12

return 0;
}


运行结果

3
9
12


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

参数个数不同

参数类型不同

参数顺序不同

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

将所有同名函数作为候选者

尝试寻找可行的候选函数

精确匹配实参

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

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

匹配失败

最终寻找到的候选函数不唯一, 则出现二义性, 匹配失败

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

函数重载的注意事项

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

函数重载在本质上是相互独立的不同函数

重载函数的函数类型不同

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

函数重载必然发生在同一作用域中

编译器需要用参数列表函数类型进行函数选择

无法直接通过函数名得到重载函数的入口地址

/*
测试代码
*/

#include <stdio.h>

int add(int a, int b)  // int(int, int)
{
return a + b;
}

int add(int a, int b, int c) // int(int, int, int)
{
return a + b + c;
}

int main()
{
printf("%p\n", (int(*)(int, int))add);
printf("%p\n", (int(*)(int, int, int))add);

return 0;
}


运行结果

004013B0
004013BE


函数重载和函数指针

重载函数名赋值给函数指针

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

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

/*
测试代码
*/

#include <stdio.h>
#include <string.h>

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(1);

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

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 函数重载