C++动态联编-函数指针
来源:互联网 发布:知乎话题怎么添加 编辑:程序博客网 时间:2024/06/05 07:50
在C++编译时,对于常规的函数调用,编译器在函数的调用出插入函数的相对地址,程序运行时可以有函数的相对地址计算出函数的绝对地址,这样函数可以被正确调用。这种在编译时就确定函数地址的联编过程叫做静态联编。动态联编是指在程序编译时,编译器并不知道函数的相对地址,调用函数的相对地址只有在程序运行时才能确定。例如在如下示例中的DisplayNumber()函数体内,编译器并不知道DisplayFormat(Number)调用的函数地址,真正的地址是在运行时通过实参传入的。
//其功能是以各种格式显示整形数字。只要传递适当的实参,该函数就能很好工作。
//如果客户需求发生变化,例如增加二进制格式的输出,只要增加相应的功能函数。
// void DisplayBinary(const int Number)即可。通用函数不必改动。
//显然,函数指针DISPLAYINTEGER给该函数增添了灵活性,得以通用。
//这得益于C++的动态联编功能,而函数指针不过是该功能的一种应用形式。
#include "stdio.h"
#include "stdlib.h"
//定义函数指针类型DISPLAYINTEGER,只想返回值为void,参数列表为(const int)的函数
typedef void (*DISPLAYINTEGER)(const INT);
//定义函数,将数字以十进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayDecimal(const int Number)
{
printf("The decimal value is %d\n",Number);
}
//定义函数,将数字以八进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayOctal(const int Number)
{
printf("The octal value is %o\n",Number);
}
//定义函数,将数字以十六进制形式输出,该函数类型与DISPLAYINTTEGER匹配
void DisplayHexadecimal(const int Number)
{
printf("The hexadecimal value is %x\n",Number);
}
/************************************************************************************
定义通用的显示数字函数
DisplayFormat DISPLAYINTEGER函数指针类型,实参可以是以上定义的
3个函数之一。通过传递不同的实参,将数字以各种格式输出
Number 准备输出的数字
************************************************************************************/
void DisplayNumber(DISPLAYINTEGER DisplayFormat,const int Number)
{
//调用以实参传入的函数,以某种格式输出整形数字
DisplayFormat(Number);
}
int main(int argc,char* argv[])
{
int Number=0;
//如果有数字形式的命令行参数,将其输出,否则输出0
if(argc>1)
Number=atoi(argv[1]);
//分别以3种格式将数字输出
DisplayNumber(DisplayDecimal,Number);
DisplayNumber(DisplayOctal,Number);
DisplayNumber(DisplayHexadecimal,Number);
return 0;
}
命令行
vitual.exe 50
的输出结果:
The decimal value is 50
The octal value is 62
The hexadecimal value is 32
- C++动态联编-函数指针
- 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数
- 虚函数&动态联编
- 二、C++动态联编-类指针(引入虚拟函数)
- C++ 虚函数、静态联编、动态联编
- C++:静态联编和动态联编
- C++:静态联编和动态联编
- C++:静态联编和动态联编
- C++:静态联编和动态联编
- C++:静态联编和动态联编
- C++:静态联编和动态联编
- 多态性之动态联编 虚函数
- C++虚函数与动态联编
- 动态联编与虚函数
- 静态联编和动态联编虚函数
- C++虚函数与动态联编
- C++:多态性1(动态联编测试)
- 07_类类型转换、继承、虚基类、 静态联编 与 动态联编、父子类指针、虚函数、类模板
- sharepoint 2010 如何创建文档库内容类型content type
- 从内存上解析c++中数组为什么不支持多态
- linux上安装svn 提示svn: Unrecognized URL scheme错误
- C#广播程序
- POJ2457(广搜)
- C++动态联编-函数指针
- MFC 单文档的全局变量
- android 刮刮乐的实现
- 30天自制操作系统-第六天
- 【eLog/VSM】如何释放被占用端口
- UVA 10806 - Dijkstra, Dijkstra.(费用流)
- 使用jquery获取radio的值
- SharePoint 2010 文档管理系列
- Ubuntu12.04TLS 上iNode的安装