第9课 函数重载分析(下)

1. 重载与函数指针

(1)将重载函数名赋值给函数指针

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

  ②严格匹配候选者的函数类型与函数指针的函数类型(所谓严格匹配,即函数参数及返回值都匹配

【编程实验】函数重载 VS 函数指针

#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;//编译器将根据函数指针的类型去严格匹配对应的函数
                    //所以会找到int func(int);其他函数则匹配不成功

    c = p(1); //

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

    return 0;
}

(2)注意事项

  ①函数重载必然发生在同一个作用域中(如,同一个类或同一命名空间中)

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

  ③无法直接通过函数名得到重载函数的入口地址(因为编译结束后,C++会根据重载函数命名的规则重命名各个函数,而原来的函数名实际上是找不到的)

2. C++和C相互调用

(1)实际工作中C++和C代码相互调用是不可避免的

(2)C++编译器能够兼容C语言的编译方式

(3)C++编译器会优先使用C++编译的方式

(4)extern关键字能强制C++编译器进行C方式的编译

【编程实验】C++调用C函数

//add.h

int add(int a, int b);

//add.c

#include "add.h"

//该文件的编译,得到目标文件add.o
//gcc -c add.c

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

//main.cpp

#include <stdio.h>

//该文件的编译
//g++ main.cpp add.o

#ifdef __cplusplus
extern "C" {
#endif

//C++中以C的方式编译:将add的函数名就是目标名
#include "add.h"

#ifdef __cplusplus
}
#endif

int main()
{
    int c = add(1, 2);

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

    return 0;
}

3. 让C/C++代码只会以C的方式编译

(1)C++内置的标准宏:__cplusplus,可以确保C代码以统一的C方式编译

#ifdef __cplusplus
extern "C" {
#endif

......; //C/C++代码,将以C的方式编译

#ifdef __cplusplus
}
#endif

【编程实验】C调用C++函数

//add.h

//该文件的编译,得到目标文件add.o
//g++ -c add.c

#ifdef __cplusplus
extern "C" {
#endif

//C++中以C的方式编译:add的函数名就是目标名
int add(int a, int b);

#ifdef __cplusplus
}
#endif

//add.cpp

#include "add.h"

//该文件的编译,得到目标文件add.o
//g++ -c add.c

#ifdef __cplusplus
extern "C" {
#endif

//C++中以C的方式编译:add的函数名就是目标名
int add(int a, int b)
{
    return a + b;
}

#ifdef __cplusplus
}
#endif

//main.c

#include <stdio.h>
#include "add.h"

//编译方式:
  //gcc main.c add.o

int main()
{
    int c = add(1, 2);

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

    return 0;
}

(2)注意事项

  ①C++编译器不能以C的方式编译重载函数,即如果在extern  "C"块里有两个同名的函数里,则会编译失败。

  ②编译方式决定函数名被编译后的目标名。C++编译方式函数名参数列表编译成目标名,而C编译方式只将函数名作为目标名进行编译。

4. 小结

(1)函数重载是C++对C的一个重要升级

(2)函数重载通过函数参数列表区分不同的同名函数

(3)extern关键字能够实现C和C++的相互调用

(4)编译方式决定符号表中的函数名的最终目标名

时间: 2024-09-29 03:38:26

第9课 函数重载分析(下)的相关文章

第8课 函数重载分析(上)

重载(Overload): C++中的函数重载: 函数重载示例: 1 #include <stdio.h> 2 #include <string.h> 3 4 int func(int x) 5 { 6 return x; 7 } 8 9 int func(int a, int b) 10 { 11 return a + b; 12 } 13 14 int func(const char* s) 15 { 16 return strlen(s); 17 } 18 19 20 int

第七课 GDB调试 (下)

1序言: 通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动.运行,打断点.查看变量.甚至改变变量等的知识,今天来大概讲解下调试bug的类型. 2知识点: 2.1 就像之前所说的没有任何一个程序员敢打包票自己写的代码是没任何bug,bug总会有意无意的出现在我们眼前,当程序运行结果于我们预期结果不一样的时候这时候我们就应该调试,总的来说bug分为:语法错误.逻辑错误.硬件异常: 3原理: 3.1 语法错误:一般情况下出现在编译的时候会有提示编译错误这时候我们就可以马上

第七课 函数的嵌套调用【项目1-4】

第七课 函数的嵌套调用 项目一[k次方之和] 设计程序,计算: 请在下面的程序结构基础上完成设计. [cpp] view plain copy print? #include<stdio.h> int power(int m,int n); //求m的n次方(m^n) int sum_of_power(int k,int n);  //从1^k到n^k的累加和 int main( ) { int k, n; scanf("%d %d", &k, &n); p

C++--第22课 - 类模板 - 下

第22课 - 类模板 - 下 1. 类模板的局部特化 类模板可以定义多个类型参数 #include <cstdlib> #include <iostream> using namespace std; template<typename T1, typename T2> class Test { public: void add(T1 a, T2 b) { cout<<(a + b)<<endl; } }; int main(int argc,

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过

函数alv下的颜色设置

ABAP中的颜色代码是由4位字都组成的 cxyz    c:color的简写,颜色代码均以C开头 x:标准色代码,SAP中一共有7个标准色    y:反转颜色启用/关闭 1/0 z:增强颜色启用/关闭 1/0 标准色代码一览表 X 颜色 主要用处 1 灰蓝色 抬头.标题栏 2 浅灰色 列表内容 3 黄色 汇总 4 蓝色 关键字 5 绿色 正确 6 红色 错误 7 橙色 控制 如: 单元格颜色控制: 定义最后显示内表的时候要在里面增加一个 colour  type lvc_T_scol,类型,这是

C和指针 (pointers on C)——第七章:函数(下)习题

这次的题目很经典. 1.Hermite Polynomials 2.求两个整数最大公约数 3.ATOI 4.可变参数列表的使用 具体的题目在这里: 题目请见 http://download.csdn.net/download/wangpegasus/5701765 1. int hermite(int n, int x) { if (n < 1) { return 1; } else if (n == 1) { return 2 * x; } else { return 2 * x * herm

计算机图形学(三)_图元的属性_3_OpenGL颜色函数(下)

OpenGL颜色函数(下) OpenGL 颜色数组 我们也可以在顶点数组中和坐标值混合一起指定场景的颜色值(参见2.17节).这既可在RGB模式下也可在RGBA模式下进行.与顶点数组一样,必须先激活OpenGL的颜色数组: glEnableClientState(GL_COLOR_ARRAY); 然后,对RGB模式要指定颜色分量的位置和格式: glColorPointer(nColorComponents,dataType,offset,colorArray); 参数nColorComponen

C语言-第36课 - 函数递归与函数设计技巧

第36课 - 函数递归与函数设计技巧 一. 递归 递归概述 (1) 递归是数学领域中的概念在程序设计中的应用. (2) 递归是一种强有力的程序设计的方法. (3) 递归的本质为函数内部在适当的时候调用自身. 组成部分 (1)递归点:以不同参数调用自身. (2)出口:不在递归调用 下面就是求一个数的阶乘的函数: #include <stdio.h> int func(int x) { if( x > 1 ) { return x * func(x - 1);  //递归点 } else {