重载定义:同一标识符在不同的上下文中有不同的意义。
重载函数定义: 用同一个函数名定义不同的函数,函数名和不同函数参数搭配时函数有不同的含义。
#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(int argc, char *argv[]) { printf("%d ", func(3)); // 3 printf("%d ", func(4, 5)); // 9 printf("%d ", func("D.T.Software")); // 12 return 0; }
函数重载条件:(至少满足下面一个条件)
1.参数个数不同
2.参数类型不同
3.参数顺序不同
//函数重载遇上函数默认参数 #include <stdio.h> 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 = func(1, 2); // 编译出错 func(int,int)目标函数不明确 return 0; }
// C++引入太多特性,而特性又是冲突的
函数重载准则:
1.将所有的同名函数作为候选函数,在候选函数进行参数匹配
2.匹配成功:可以精确匹配每个参数
通过默认参数可以匹配参数
通过类型转换可以匹配参数
3.匹配失败:可以同时匹配多个函数。
无法匹配任何一个函数。
注意:
1. 重载函数本质上时不同的函数,有不同的内粗地址。
2. 重载函数的函数类型不同。
3. 函数返回值不可以作为重载判断条件。
4. 重载用函数名和参数列表决定。
#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 ", (int(*)(int, int))add); //address1 printf("%p ", (int(*)(int, int, int))add); //address2 return 0; }
函数重载与函数指针
将函数指针赋值给函数重载时:
1. 选函数指针参数与候选者函数参数列表一样。
2. 选函数指针返回值与候选者函数参数返回值一样(函数类型一样)。
#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 argc, char *argv[]) { int c = 0; PFUNC p = func; c = p(1); printf("c = %d ", c); return 0; }
注意:
1. 函数重载必须发送在同一作用域(全局作用域,类作用域)。
2. 无法通过函数名得到重载函数入口地址,函数名和参数列表共同决定函数入口地址。