简单的示例:

#include <iostream>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
int main()
{
cout << sum(, ) << endl;
int (*pf)(int, int); // 未初始化
pf = sum;
cout << pf(, ) << endl;
/* output:
3
7
*/
return ;
}

遇到重载的情况,编译器通过指针类型精确匹配函数。

#include <iostream>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
int sum(int x, double y)
{
cout << "sum2" << endl;
return x + y;
}
int main()
{
cout << sum(, ) << endl;
int (*pf)(int, int); // 未初始化
pf = sum;
cout << pf(, ) << endl;
/* output:
3
7
*/
return ;
}

将函数作为参数:

#include <iostream>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
typedef decltype(sum) func;
int useInt2(int x, int y, func f)
{
return f(x, y);
}
int main()
{
cout << useInt2(, , sum) << endl;
/* output = 7 */
return ;
}

返回类型不会自动地转换成指针,我们必须显示地将返回类型指定为指针,但是我想,除非是函数内部还可以构造函数(例如Python那样),否则返回函数也没什么用。

练习

6.54

#include <iostream>
#include <vector>
using namespace std;
int sum(int x, int y)
{
return x + y;
}
int main()
{
using pf = int(*)(int, int);
vector<pf> pfvec;
return ;
}

6.55 & 6.56

#include <iostream>
#include <vector>
using namespace std;
int add(int x, int y)
{
return x + y;
}
int subtract(int x, int y)
{
return x - y;
}
int multiply(int x, int y)
{
return x * y;
}
int divide(int x, int y)
{
return x / y;
}
int main()
{
using pf = int(*)(int, int);
vector<pf> pfvec;
pfvec.push_back(add);
pfvec.push_back(subtract);
pfvec.push_back(multiply);
pfvec.push_back(divide);
for (pf f : pfvec) {
cout << f( , ) << endl;
}
return ;
}

输出结果:


【c++ primer, 5e】函数指针的更多相关文章

  1. C++基础——函数指针 函数指针数组

    ==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...

  2. C++函数指针

    然后,我在想C++函数指针到底有啥用呢.想了又想,我想出来一种,就是将函数地址(函数n)作为函数(函数1)的参数时,便可以在访问函数1的时候就决定了,在函数1里面调用的是哪一个函数(函数1,2,3,4 ...

  3. C++中怎么获取类的成员函数的函数指针?

    用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} ...

  4. C/C++中的函数指针的使用与总结

    概要: 函数指针介绍 typedef简化函数指针的定义 指向函数的指针的初始化和赋值 通过指针调用函数 函数指针形参 返回指向函数的指针 指向重载函数的指针 参考<C++ Primer> ...

  5. 【转】C/C++ 函数指针与类函数指针

    转自:http://blog.csdn.net/iamshaofa/article/details/17614615 C函数指针 int numAdd(int a, int b) { return a ...

  6. 【C/C++】函数指针

    首先必须要清楚如下: [1]函数指针即函数的地址,也就是存储其机器语言代码的首地址.该地址用函数名表示. [2]用具体的函数名给函数指针变量赋值时必须满足两者的类型(即函数返回值类型)和特征标(即函数 ...

  7. C/C++学习:函数指针

    曾经在书上看到函数指针相关的都没怎么重视.可是近期在实际的工作中却派上了用场.所以认真地学习了一遍. 函数指针的申明 申明一个函数指针非常easy,就是将函数申明中的函数名替换为一个指针就可以: C/ ...

  8. STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析

    在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handle ...

  9. 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()

    我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...

  10. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

随机推荐

  1. spring @Transactional注解参数详解(转载)

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean i ...

  2. json写入到excel表

    1. 拼接返回的json数据 // 拼接需要下载报表的HTML,并返回html;reportHtml(reporttData) { let html = `<html xmlns:o=" ...

  3. Hadoop单点伪分布模式安装

    Hadoop单点伪分布模式安装 概述 单点 single-node,单节点,即一台计算机. 伪分布式模式 pseudo-distributed mode 所谓集群,表面上看是多台计算机联合完成任务:但 ...

  4. 在ubuntu上部署Kubernetes管理docker集群示例, vxlan,gre

    http://www.chenshake.com/openstack-folsom-guide-for-ubuntu-12-04/ http://www.cnblogs.com/sammyliu/p/ ...

  5. js foreach

    array1.forEach(callbackfn[, thisArg]) 参数 定义 array1 必需. 一个数组对象. callbackfn 必需. 一个接受最多三个参数的函数. 对于数组中的每 ...

  6. 【转】UML中类与类之间的5种关系表示

    一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一 ...

  7. How many---hdu2609(最小表示)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 给你n个01串,然后求这n个串中有几个不同的: 例如:1100 ,1001 ,0011 ,011 ...

  8. Win32 配置文件用法

    #include "stdafx.h"#include <Shlobj.h>#include <Shlwapi.h> #pragma comment(lib ...

  9. Flask-Session SQLAlchemy Script Migrate wtforms

    Flask-session Flask-session跟框架自带的session有什么区别呢~ 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方 ...

  10. Jenkins的安装及邮件配置

    Jenkins介绍  Jenkins,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括: 1).持续的软件版本发布/测试项目. 2).监控外部调用执行的工作. Jenkins安装 j ...