课堂笔记

课程回顾

        多态 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语言中的函数回调.函数指针作为函数参数.






Day8 函数指针做函数参数的更多相关文章

  1. 函数指针做函数参数,其中有typedef的相关,感觉这是构成大河的小溪

    #include<stdio.h> #include<stdlib.h> #include<string.h> int Funcadd(int a, int b) ...

  2. go语言基础之数组指针做函数参数

    1.数组指针做函数参数 示例: package main //必须有个main包 import "fmt" //p指向实现数组a,它是指向数组,它是数组指针 //*p代表指针所指向 ...

  3. go语言基础之指针做函数参数用地址传递

    1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(p1, p2 *int) { *p1, *p2 = *p ...

  4. go语言基础之指针做函数参数

    1.指针做函数参数 示例: package main //必须有个main包 import "fmt" func swap(a, b int) { a, b = b, a fmt. ...

  5. Delphi 函数指针(函数可以当参数)

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  6. C++中的函数指针和函数对象总结

    篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. ...

  7. typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结

    https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...

  8. C#委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

  9. c++入门之函数指针和函数对象

    函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...

随机推荐

  1. JAVA分词包

    自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换 http://www.hankcs.com/nlp/ https://github.com ...

  2. 宿主机系统 Deepin 15.4,解决 Virtualbox 5.1 中 XP虚拟机无法使用 USB设备(如:U盘、罗技优联接收器等)的问题

    软件环境 宿主机系统:Deepin 15.4.1, 虚拟机软件:VirtualBox 5.1 虚拟机系统:XP 操作步骤如下: (1)  安装 Virtualbox Extension Pack 进入 ...

  3. CSS魔法堂:稍稍深入伪类选择器

    前言  过去零零星星地了解和使用:link.::after和content等伪类.伪元素选择器,最近看书时发现这方面有所欠缺,于是决定稍微深入学习一下,以下为伪类部分的整理. 伪类  伪类选择器实质上 ...

  4. IDEA下Maven的Offline Mode

    今天上午别人加了一个Maven依赖项(dependency)我始终获取不到本地 Maven的setting.xml文件检查没有问题 根目录的pom.xml检查也没有问题 本来怀疑公司的Maven服务器 ...

  5. OKDownload 下载框架 断点续传 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. 微信小程序生成海报分享:canvas绘制文字溢出如何换行

    主要思路: 1.先分割为字符串数组,然后一个字一个字绘图,利用ctx.measureText(string) 方法,获取绘制后的宽度,判断宽度在多少内就另起一行,再将各行拼成一个字符串 2.计算另起的 ...

  7. Android自定义控件实战——滚动选择器PickerView

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38513301 手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器, ...

  8. Transport scheme NOT recognized: [stomp]

    今天在ubuntu上装个activemq,本来以为就是apt-get install activemq就行了的. 结果配置上stomp协议,activemq居然起不来.起不来就起不来吧,也没个提示. ...

  9. Windows下python3生成UTF8的CSV文件和sha256sum踩坑记录

    CSV的坑 在Ubuntu下是简单的写入完事 import csv ... with open(filename, 'w') as output: f = csv.writer(output) f.w ...

  10. bootstrap响应式前端页面

    技术:HTML+CSS+JS+bootstrap   概述 这套代码响应式前端页面基本写完了,适合初学前端的同学,里面主要运用了HTML+CSS布局和动画,js逻辑较少,页面都是静态,未接入接口.响应 ...