zoukankan      html  css  js  c++  java
  • Day8 函数指针做函数参数

    课堂笔记

        课程回顾

            多态 virtual关键字 纯虚函数 virtual func() = 0;
            提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数.
            多继承的二义性 .
            重载 重写 重定义.
            实现多态的理论基础:函数指针做函数参数.
            vptr指针与虚函数表.
            构造函数不应为虚函数 多态会降低程序的执行速度.不建议所有的函数都是虚函数.
            多态时的指针步进.
            多继承在项目开发中使用的比较少.
            linux从2.4内核升级到2.6的时候,做到了电源可以热插拔,提前将电源驱动的接口规划出来了,各个厂商实现电源接口,内核自动检测电源端口,动态调用电源函数,实现电源可热插拔.
            面相抽象类编程的案例(信息系统框架集成第三方产品).

        数组指针语法梳理

            面向接口编程和C的多态.
            1.指向数组的指针 
    1. //定义一个指针数组类型
    2. typedef int (*PTypeArray)[10];
    3. //定义一个指向数组的指针
    4. PTypeArray mArray;
    5. int a[10] = {0};
    6. //对数组取地址,得到指向数组的指针
    7. mArray = &a;
    8. //这样就可以修改数组内的元素了
    9. (*mArray)[0] = 20;
            2.直接定义指向数组的指针
    1. int (*MyPointer)[10];//变量,编译器会分配内存
    2. MyPoint = &a;
    3. (*MyPointer)[0] = 40;//不需要定义数据类型就可以定义指向数组的指针

        函数指针语法梳理

            如何定义一个函数类型 
    1. int S (int a,int b)
    2. {
    3. return a+b;
    4. }
            如何定义一个函数类型
    1. //定义一个函数类型
    2. typedef int (MyFuncPtr)(int a,int b);
    3. //定义一个指针,指针指向特性类型的函数
    4. MyFuncPtr *funcPtr = NULL;
    5. //取函数入口地址并赋值
    6. funcPtr = ∑
    7. //函数指针调用函数
    8. funcPtr(3,4);//间接调用
            如何定义一个函数指针(指向一个函数的入口地址)
    1. //定义一个函数指针类型
    2. typedef int (*MyFuncPtr)(int a,int b);
    3. //定义一个指针,指针指向特定类型的函数
    4. MyFuncPtr funcPtr = NULL;
    5. //取函数入口地址并赋值
    6. funcPtr = ∑
    7. //函数指针调用函数
    8. funcPtr(3,4);//间接调用

        函数指针做函数参数思想

            函数可以被函数名直接调用,也可以被函数指针类型间接调用.
            将函数的入口地址当作函数参数
    1. //定义数据类型,函数指针数据类型
    2. typedef int (*FuncPtr)(int a,int b);
    3. //函数指针作为函数参数
    4. int mainOp(FuncPtr funcPtr);
            这是一种非直接调用,将代码复杂度提高,但是软件分层. FuncPtr是任务的实现者,mainOp是任务的调用者,这样可以实现任务的编写和任务的实现分开.
            这样实现了多态的扩充效果,将多个函数指针放到一个数组中,就类似于一个虚函数表了.
            函数指针做函数参数,实现了框架和代码实现的分离,实现了 解耦合.(回调函数案例).

            函数指针类型的本质:依靠函数指针的类型,提前做了一个协议的约定,将函数的参数 函数返回值提前约定.

        函数指针正确调用案例

            函数指针做函数参数有两个用法 
            1.正向调用: WIN32动态链接库 就是正向调用. 拿到函数地址正向调用.
    1. typedef int (*SQRTPROC)(int,int)//定义一个函数指针类型
    2. SQRTPROC pFunction;//定义一个函数指针
    3. HINSTANCE hInstance;//声明一个句柄
    4. hInstance = ::LoadLibrary("DLL文件路径");//获取句柄的实例,也就是DLL的实例
    5. //获取方法,读取函数的入口地址,VERIFY检测表达式是否为空
    6. VERIFY(pFunction = (SQRTPROC*)::GetProcAddress(hInstance,"SqartRoot"));
            2.反向调用:动态库-->>框架
            1.提前好一套接口,定义函数指针类型(提前约定函数参数和函数返回值)
            2.在动态库的外部,发布一套接口协议
            3.厂商根据定义的协议去实现
            4.在框架中,回调第三方的任务.
            也就是说,DLL中定义函数名称,通过.H文件发布,然后用户手工实现这些函数,这些函数以函数指针作为函数参数的形式进入动态库中,这就是动态库的回调.

          C动态库升级为框架


           基本需求

            保留区域,C语言的函数指针回调机制实现.

           环境搭建

            添加动态库到工程,添加LIB到工程,添加.H文件到工程.

           动态库中添加回调函数

                在动态库中定义函数指针,动态库中的函数以某些指针作为参数.

           回调函数缓存到动态库

                将回调函数直接注入到动态库中,方法如下
                在动态链接库中为函数分配内存,保存函数数据.这样,只要初始化过了,就可以持续的调用.

        C++基础课程知识点梳理

            继承,派生,多态,虚函数 纯虚函数,类型兼容性原则,构造函数与析构函数在继承中的调用模式.
            多继承的二义性,多态的虚函数表,函数重载,函数重写,函数重定义 virtual的有无对程序的影响.
            多态子类指针和父类指针的步长.C语言中的函数回调.函数指针作为函数参数.






  • 相关阅读:
    P2319 [HNOI2006]超级英雄
    P4302 [SCOI2003]字符串折叠
    P1122 最大子树和
    HDU——2089 不要62
    P4555 最长双回文串
    P1463 [HAOI2007]反素数
    P2412 查单词
    P2787 语文1(chin1)- 理理思维
    P3078 [USACO13MAR]扑克牌型Poker Hands
    ubuntu中desktop与alternate版本的区别(转载)
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/c34122afb630065f049b4830fd154682.html
Copyright © 2011-2022 走看看