黑马程序员技术交流社区

标题: 【上海校区】C++学习14:使用typedef定义函数指针类型 [打印本页]

作者: wuqiong    时间: 2018-7-14 09:00
标题: 【上海校区】C++学习14:使用typedef定义函数指针类型

typedef可以用于定义函数指针类型:

【语法】
typedef <返回类型> (*<函数类型名>)(参数表)
typedef <返回类型> (<类名>::*<函数类型名>)(参数表)

【用途】
1、可以用来定义该函数类型的函数指针,就不用每次使用函数指针都要写一次函数原型了;
2、有了类型名,就可以使用在容器里面,譬如map<int, 类型名>,用于实现灵活的函数调用。

【示例】

例1:
typedef void (*PF)(int x);

void func1(int x){ cout<<"func1:"<<x<<endl;}

void func2(int x){ cout<<"func2:"<<x<<endl;}

void main()
{
  PF pFunc;    //声明一个函数指针只需要用PF类型名
  pFunc = func1;  //此处也可以使用pFunc = &func1;
  pFunc(38);
  pFunc = func2;
  pFunc(99);
}

-----------------------------------------------------------------------------------------------

例2:
class CUtil
{
public:
  CUtil();
  typedef void (CUtil::*pUFunc)(int);  //定义原型为void CUtil::func(int)的函数指针的别名为pUFunc
  map<int, pUFunc> funcMap;     //可以用做map容器的元素类型
  void laner(int x);
  void execute();
};

CUtil::CUtil()
{
  funcMap[0] = &CUtil::laner;  //这里初始化map容器,关联数字0和函数laner
}

void CUtil::laner(int x)
{
  cout<<"laner:"<<x<<endl;
}

void CUtil::execute()
{
  (this->*funcMap[0])(38);   //调用map[0]关联的函数
  //注意1:这里必须使用this->,否则会有error C2171: “*”: “void (__thiscall CUtil::* )(int)”类型的操作  数非法的错误
  //注意2:这里必须使用*解引用,才能实现函数调用,否则会有error C2064: 项不会计算为接受 1 个参数的函数的错误
}

void main()
{
  CUtil pUtil = new CUtil();
  pUtil->execute();
  (pUtil->*(pUtil->funcMap[0]))(38);  //与上一句等效,注意括号要用正确
}



作者: wuqiong    时间: 2018-7-15 10:22

作者: 不二晨    时间: 2018-7-17 14:00
棒棒哒
作者: 小影姐姐    时间: 2018-7-18 10:45
牛牛牛!
作者: 吴琼老师    时间: 2018-7-18 15:01

作者: 不二晨    时间: 2018-7-20 11:02
优秀,奈斯
作者: 摩西摩西OvO    时间: 2018-7-23 14:17

作者: wuqiong    时间: 2018-7-24 16:43

作者: 吴琼老师    时间: 2018-7-26 16:27





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2