码迷,mamicode.com
首页 > 编程语言 > 详细

C++函数指针

时间:2019-03-17 10:26:13      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:names   参数   include   end   调用   初始化   代码   设计   表达式   

为了复试,重新从零翻开了一遍C++程序设计基础,看到函数指针,才想到这个地方我一开始学的时候就没学懂,趁这次机会把它搞懂。直接上代码,注释很详细:

#include <iostream>
using namespace std;

typedef int (*funType)(int, int);
typedef int funType2(int, int);

typedef int *(*pfunType)(int, int);
typedef int *(pfunType2)(int, int);

int funA(int a, int b)
{
	cout << "调用了 int funA()" << endl;
	return a + b;
}

int *funB(int a, int b)
{
	cout << "调用了int *funB()" << endl;
	int *p = new int;
	*p = a - b;
	return p;
}


void callFunA(funType* cfun, int a, int b)//这里传递的是funType类型的指针
{
	cout << (*cfun)(a, b) << endl;// ok,这里是解指针调用
	//cout << cfun(a, b) << endl; //error 明显调用表达式前的括号必须具有(指针)函数类型
}

void callFunA2(funType cfun, int a, int b)//这里传递的是funType类型变量
{
	cout << (*cfun)(a, b) << endl;//ok,这里是解指针调用
	cout << cfun(a, b) << endl;//ok,这里直接调用
}

void callFunB(pfunType* pcfun, int a, int b)
{
	int *p = (*pcfun)(a, b);
	//int *p = pcfun(a, b);//error 明显调用表达式前的括号必须具有(指针)函数类型
	cout << *p<< endl;
	delete p;
}

void callFunB2(pfunType2 pcfun, int a, int b)
{
	int *p1 = (*pcfun)(a, b);//ok
	int *p2 = pcfun(a, b);//ok

	cout << *p1 << endl;
	cout << *p2 << endl;

	delete p1;
	delete p2;
}

int main()
{
	int a = 5, b = 8;

	funType fT = funA; //ok
	//funType* fT_p = &funA;//error 类型参数不兼容
	//funType2 fT2 = funA;//error 未能初始化fT2,怎么能初始化fT2?,难道funType2 就不能用来声明函数对象?

	pfunType pfT = funB;//0k
	//pfunType2 pfT2 = funB;//error 同fT2

	callFunA(&fT, a, b);//0k
	//callFunA(funA, a, b);//error 类型参数不兼容,尝试直接传递funA函数入口地址失败
	callFunA2(fT, a, b);//ok
	
	callFunB(&pfT, a, b);//ok
	//callFunB(funB, a, b);//error 类型参数不兼容
	callFunB2(pfT, a, b);//ok
	callFunB2(funB, a, b);//ok


	system("pause");
	return 0;
}

C++函数指针

标签:names   参数   include   end   调用   初始化   代码   设计   表达式   

原文地址:https://www.cnblogs.com/wangzhizhen/p/10545731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!