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; }
相关文章推荐
- PE文件学习系列笔记四-C++实现PE文件的分析
- c&c++反汇编与逆向分析学习笔记(5)--加法的求值过程和编译器优化
- C++学习笔记23,类内函数重载
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理(原创)
- C/C++学习笔记3 - cin深入分析(下) - cin的错误处理(原创)
- 学习笔记:C++ 函数重载
- c&c++反汇编与逆向分析学习笔记(7)--乘法表达式
- 【C++】学习笔记草稿版系列2(函数重载)
- C++学习笔记4——引用的本质分析
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配
- 【C++】学习笔记四十二——函数重载
- C++学习笔记5——内联函数分析
- C++学习笔记2--函数重载 复杂的数据 内存对齐 指针数组 结构与指针 传值传址传引用 联合枚举类型别名
- c&c++反汇编与逆向分析学习笔记(8)--除法表达式
- C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- 传智播客c/c++公开课学习笔记--C语言与木马恶意代码分析和360安全防护揭秘
- member template成员模板笔记----C++学习之路
- C++学习笔记(二)C++primer 部分习题和知识点