C++学习笔记 第九课 函数重载与函数指针

学习笔记内容来自:狄泰软件学院 唐佐林老师 的视频,十分感谢您的指导

函数重载遇上函数指针:

将重载函数名赋值给函数指针时:
1.根据重载规则挑选与函数指针参数列表一致的候选者
2.严格匹配候选者的函数类型与函数指针的函数类型,即函数的返回值类型也要匹配

比如:

int func(int a)
{
  return a;
}

int func(int a,int b)
{
  return a+b;
}

void func(int a)
{
  std::cout<<a<<std::endl;
}

typedef int(*PFUNC)(int a)

当调用PFUNC p = func;时,匹配的是第一个函数

注意:
1.函数重载必然发生在同一个作用域中
2.编译器需要用参数列表或函数返回值类型进行函数选择
3.无法直接通过函数名得到重载函数的入口地址
正确做法为:

printf(%p\n”,int(*)(int)func);
printf(%p\n”,int(*)(int,int)func);
printf(%p\n”,void(*)(int)func);

C++和C相互调用

1.实际工程中C++和C代码相互调用是不可避免的
2.C++编译器能够兼容C语言的编译方式
3.C++编译器会优先使用C++编译的方式
4.extern关键字(在C++里才有)能强制让C++编译器进行C方式的编译

extern “C”
{
  //code...
}

比如:
在add.h文件中:

int add(int a,int b);

在add.c文件中:

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

以上两个文件都是C语言的,当我们在C++文件中要引用add.h头文件时,如在main.cpp中,

#include <stdio.h>

extern “C”
{
  #include “add.h”
}

int main()
{
  int c = add(1,2);
  printf(“c = %d\n”,c);

  return 0;
}

这样才编译通过,否则编译器指出函数未定义,因为add函数是在add.c中定义而不是add.cpp

如何保证C的代码一定以C编译器的方式编译呢?
答:_cplusplus宏是C++编译器里的一个标准宏,所有C++编译器都有,利用这个特性,可以这样做:

#ifdef _cplusplus
extern “C”
{
#endif
//C code...

#ifdef _cplusplus
}
#endif

注意事项

1.C++编译器不能以C的方式编译重载函数
2.编译方式决定函数名被编译后的目标名
3.C++编译方式将函数名和参数列表编译成目标名
4.C编译方式只将函数名做为目标名编译

发布了14 篇原创文章 · 获赞 0 · 访问量 101

猜你喜欢

转载自blog.csdn.net/u012321968/article/details/104450169
今日推荐