《C++ Primer》学习 之 函数指针相关用法

/*
  函数指针相关用法
*/

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #define HOME
 3 //#define NDEBUG
 4 #include <iostream>
 5 #include <stdexcept>
 6 #include <cassert>
 7 #include <ctype.h>
 8 #include <locale>
 9 #include <iterator>
10 #include <cmath>
11 #include <string>
12 #include <vector>
13 #include <initializer_list>
14 #include <ctime>
15 using namespace std;
16 using ptrFun = int(*)(int, int);
17
18 int myAdd(int x, int y)
19 {
20     return (x + y);
21 }
22 int mySub(int x, int y)
23 {
24     return (x - y);
25 }
26
27 int myMul(int x, int y)
28 {
29     return (x * y);
30 }
31
32 int myDiv(int x, int y)
33 {
34     if (0 == y)
35     {
36         std::cerr << "error : 除以0" << endl;
37         return -1;
38     }
39     else
40     {
41         return (x / y);
42     }
43 }
44
45 void Compute(int x, int y, int (*p)(int, int))
46 {
47     cout << p(x, y) << endl;
48 }
49
50
51 int main(int argc, char **argv)
52 {
53 #ifdef HOME
54     //freopen("in", "r", stdin);
55     //freopen("out", "w", stdout);
56 #endif
57
58     cout << "方法一:" << endl;
59     // 以下两种声明方式也是可以的
60     //vector<int(*)(int, int)> vecFunc;
61     //vector<ptrFun> vecFunc;
62     vector<decltype(myAdd)*> vecFunc;
63     vecFunc.push_back(myAdd);
64     vecFunc.push_back(mySub);
65     vecFunc.push_back(myMul);
66     vecFunc.push_back(myDiv);
67     for (int i = 0; i < vecFunc.size(); ++i)
68     {
69         cout << vecFunc[i](6, 3) << endl;
70         cout << (*vecFunc[i])(6, 3) << endl;
71         Compute(6, 3, vecFunc[i]);
72     }
73
74     cout << endl << "方法二:" << endl;
75     decltype(myAdd) *p1 = myAdd, *p2 = mySub, *p3 = myMul, *p4 = myDiv;
76     vector<decltype(myAdd)*> vec1Func = { p1, p2, p3, p4 };
77     for (int i = 0; i < vec1Func.size(); ++i)
78     {
79         cout << vec1Func[i](6, 3) << endl;
80         cout << (*vec1Func[i])(6, 3) << endl;
81         Compute(6, 3, vec1Func[i]);
82     }
83
84 #ifdef HOME
85     std::cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl
86         << "message: " << __FILE__ << endl
87         << "        : in function " << __func__
88         << " at line " << __LINE__ << endl
89         << "          Compiled on " << __DATE__
90         << " at " << __TIME__ << endl;
91 #endif
92     return 0;
93 }
时间: 2024-10-13 22:22:20

《C++ Primer》学习 之 函数指针相关用法的相关文章

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

曾经在书上看到函数指针相关的都没怎么重视.可是近期在实际的工作中却派上了用场.所以认真地学习了一遍. 函数指针的申明 申明一个函数指针非常easy,就是将函数申明中的函数名替换为一个指针就可以: C/C++ int test(int para1, double *para2); // 函数申明 int (*pf)(int para1, double *para2); // 函数指针申明 NOTE: 必须在申明中用括号将*pf括起来,由于括号的优先级比*运算符高.因此: C/C++ int (*p

C++Primer 学习笔记之指针和引用

1.引用概念 引用引入了对象的一个同义词.定义引用的表示方法与定义指针相似,只是用&带起了*. 例如:Point pt1(10,10); Point &pt2 = pt1;//定义pt2为pt1的引用.通过这样的定义,pt1和pt2表示同意对象,需要特别强调的是引用并不是产生对象的副本,仅仅是对象的同义词.因此,当下面的语句执行后: pt1.ofset(2,2); pt1和pt2都具有了(12,12): 引用必须在定义的时候马上初始化,因为它必须是某个东西的同义词.你不能先定义一个引用后才

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>

函数指针的用法

函数指针试吃由于函数地址的指针.针织能够指向函数对于C/C++来说很重要也很有用,这为我们编译时未确定的顺序呢执行函数提供了另一种选择,而不需要使用条件语句. 1.声明函数指针 void (*foo)(); int (*f1)(double);//传入double,返回int void (*f2)(char*);//传入char*指针,没有返回值 double* (*f3)(int,int);//返回double指针 如果去掉第一对括号就成了返回 void* 的函数了! 下面的例子就是返回指针的

0715-----C++Primer听课笔记-----------函数指针 、单例模式

1.函数指针 1.1 普通成员函数指针包含类名信息以及const属性,指向具体函数是必须加上&符号. #include <iostream> using namespace std; class Test{ public: void setValue(const string &s, int a){ s_ = s; a_ = a; } void print() const{ cout << s_ << endl << a_ <<

Nodejs学习之net模块相关用法详解

net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net.Socket).也就是说,做node服务端编程,net基本是绕不开的一个模块.本文就和大家详细扒一扒Nodejs的net相关用法,希望对大家学习Nodejs 有所帮助吧.  从组成来看,net模块主要包含两部分,了解socket编程的同学应该比较熟悉了:  · net.Server:TCP server,内部

C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论

今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程中执行.最终目标是,继承的业务逻辑类外部调用时有两个接口可选,调用syncRun同步执行:调用由引擎自动生成的asyncRun就异步执行.最终自动生成asyncRun的模板基类没能实现,主要原因是mingw对this处理的太有问题了!!原本以为编译器问题,后来才知道成员函数指针和this指针如此特殊

C函数指针的用法

1.最简单的用法: 1 #include <cstdio> 2 3 int (*p)(int);//定义一个函数指针变量p(下面的f其实是一个常量函数指针) 4 int f(int x) 5 { 6 printf("%d\n",x+2); 7 return 0; 8 } 9 10 int main() 11 { 12 p=f; 13 p(2);//等价于f(2) 14 return 0; 15 } 还有另一种对应写法,不过实在不喜欢,可以忽略.简单来说,就是f()与(*f)

C语言学习019:函数指针

在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函数指针的公式: 返回类型 (*指针变量)(参数类型) 1 #include <stdio.h> 2 3 int add(int n,int m){ 4 return n+m; 5 } 6 7 int sub(int n,int m){ 8 return n-m; 9 } 10 11 int mai