• 函数指针


    • 定义函数指针模板: bool (*pf)(const string &, const string &);
      *pf两端的括号是必须的
      使用函数指针:
       1 #include <iostream>
       2 using namespace std;
       3 int func(int a, int b)
       4 {
       5     return a+b;
       6 }
       7 int main()
       8 {
       9    int (*p_func) (int a, int b) = func;
      10     cout << p_func(1,2)<<endl;
      11     return 0;
      12 }
    • 用typedef简化函数指针
      如果要多次使用该类指针,直接用p_func定义新的指针即可
       1 #include <iostream>
       2 using namespace std;
       3 typedef int (*p_func) (int a, int b);
       4 int func(int a, int b)
       5 {
       6     return a+b;
       7 }
       8 int main()
       9 {
      10     p_func p_temp = func;
      11     cout << p_temp(1,2)<<endl;
      12     return 0;
      13 }
    • 函数名前可加&,可不加,直接引用函数名等效于在函数名上应用取地址操作符,函数指针前加0表示该指针不指向任何函数
    • 指针可以加*,可不加
    • 若指针没有初始化或值为0,不能调用
    • 函数指针形参
      函数的形参可以是指向函数的指针
      例:
       1 #include <iostream>
       2 using namespace std;
       3 typedef int (*p_func) (int a, int b);
       4 int func(int a, int b)
       5 {
       6     return a+b;
       7 }
       8 int func2(int (*a) (int a, int b))
       9 {
      10     return a(1,2);
      11 }
      12 int main()
      13 {
      14     p_func ppp = func;
      15     cout << func2(ppp);
      16     return 0;
      17 }

    • 返回函数指针
      模板: int (*ff(int))(int*, int); 
      解释: ff(int) 为一个函数,形参为int;返回值为int (*)(int*, int),是一个函数指针,指向形参为(int*, int)返回值为int的函数
      若用typedef定义函数指针 typedef int (*PF)(int*, int); ,则函数的定义可改写为 PF ff(int); 
    • 函数的形参可以是函数,但返回值不能是函数,需是函数指针。
      函数类型形参所对应的实参将被自动转换为指向相应函数类型的指针
      1 // func is a function type, not a pointer to function!
      2 typedef int func(int*, int);
      3 void f1(func); // ok: f1 has a parameter of function type
      4 func f2(int); // error: f2 has a return type of function type
      5 func *f3(int); // ok: f3 returns a pointer to function type


      当p_func是函数类型:

       1 #include <iostream>
       2 using namespace std;
       3 typedef int p_func (int a, int b);
       4 int func(int a, int b)
       5 {
       6     return a+b;
       7 }
       8 p_func* func2(int (*a) (int a, int b))
       9 {
      10     p_func* p = func;
      11     return p;
      12 }
      13 int main()
      14 {
      15     p_func* p1 = func;
      16     cout << p1(1,2);
      17     return 0;
      18 }

      可成功输出3

      当p_func是函数指针类型

       1 #include <iostream>
       2 using namespace std;
       3 typedef int (*p_func) (int a, int b);
       4 int func(int a, int b)
       5 {
       6     return a+b;
       7 }
       8 p_func func2(int (*a) (int a, int b))
       9 {
      10     p_func p = func;
      11     return p;
      12 }
      13 int main()
      14 {
      15     p_func p1 = func;
      16     cout << p1(1,2);
      17     return 0;
      18 }

      可成功输出3

    • 指向重载函数的指针
      指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误
  • 相关阅读:
    [摘录]第9章 解密优势谈判高手
    [摘录]第8章 与非美国人谈判的技巧
    [摘录]第7章 谈判压力点
    [摘录]第6章 解决棘手问题的谈判艺术
    [摘录]第5章 谈判原则
    [摘录]第4章 不道德的谈判策略
    [摘录]第3章 终局谈判策略
    [摘录]第2章 中场谈判技巧
    [摘录]第1章 开局谈判技巧
    SQL Server 视图索引
  • 原文地址:https://www.cnblogs.com/2020R/p/13189070.html
Copyright © 2020-2023  润新知