1、函数重载
2、函数重载条件
合法的,
只有返回值不同,是不能确定为函数重载的
但是,当重载遇上指针时,重载函数要严格要求匹配参数和返回值类型
3、
编译器报错,不会调用,出现二意性
4、
5、函数重载的本质
#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;
}
打印两个函数入口地址,发现重载的函数入口地址是不同的,证明两个函数是不同的
6、小结
7、重载与指针
第一个
#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\n", c);
return 0;
}
8、
9、
10、
11、
#ifdef __cplusplus
extern "C" {
#endif
#include "add.h"
#ifdef __cplusplus
}
#endif
此方法既能保证 代码在C编译器通过又能保证在C++编译器下通过,都是按照C的编译方式来编译
12、
使用 nm命令可以查看编译过后的文件中 函数命
g++ -c test.cpp -o test.o
nm test.o
int add(int a, int b)
{
return a + b;
}
int add(int a)
{
return a;
}
const char* add(const char* a)
{
return "abcd";
}
0000000000000014 T _Z3addi
0000000000000000 T _Z3addii
0000000000000020 T _Z3addPKc