C++ 函数指针的应用场景

50 篇文章 3 订阅

函数指针

函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:

int add(int nLeft,int nRight);//函数定义  

该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可:

int (*FP_CALC)(int,int);//c未初始化  
typedef int (*FP_CALC)(int,int);//c++ 定义一个函数指针类型

则pf可指向int(int,int)类型的函数。pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则pf可指向int(int,int)类型的函数。而add类型为int(int,int),则pf可指向add函数。

pf = add;//通过赋值使得函数指针指向某具体函数
注意:*pf两端的括号必不可少,否则若为如下定义:

int *pf(int,int);//此时pf是一个返回值为int*的函数,而非函数指针  

四则运算

typedef函数指针用法

#include <stdio.h>
#include <assert.h>
 
typedef int (*FP_CALC)(int,int);//定义一个函数指针类型
 
int add(int a, int b)
{
	return a + b;
}
 
int sub(int a, int b)
{
	return a - b;
}
 
int mul(int a, int b)
{
	return a * b;
}
 
int div(int a, int b)
{
	return b ? a/b : -1;
}
 
//定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、
//返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址
FP_CALC calc_func(char op)
{
	switch( op )
	{
	case '+':
		return add;
	case '-':
		return sub;
	case '*':
		return mul;
	case '/':
		return div;
	default:
		return NULL;
	}
	return NULL;
}
 
//s_calc_func为函数,它的参数是 op,   
//返回值为一个拥有两个int参数、返回类型为int的函数指针  
int (*s_calc_func(char op)) (int , int)
{
	return calc_func(op);
}
 
//最终用户直接调用的函数,该函数接收两个int整数,
//和一个算术运算符,返回两数的运算结果
int calc(int a, int b, char op)
{
	FP_CALC fp = calc_func(op);
	int (*s_fp)(int,int) = s_calc_func(op);//用于测试
 
	assert(fp == s_fp);// 可以断言这两个是相等的
 
	if(fp)
		return fp(a,b);
	else
		return -1;
}
 
void main()
{
	int a = 100, b = 20;
 
	printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
	printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));   
    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));   
    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/')); 
}

dll 动态加载

//定义函数指针
typedef std::string(*PI_FormatErrorMessageFun)(HRESULT hr);
PI_FormatErrorMessageFun PI_FormatErrorMessage = NULL;
//加载函数
QLibrary m_library;
PI_FormatErrorMessage = (PI_FormatErrorMessageFun)m_library.resolve("PI_FormatErrorMessage");
std::string messages = PI_FormatErrorMessage(returnMessages);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值