C++面向对象高级特性及GWES图形GUI.ppt_第1页
C++面向对象高级特性及GWES图形GUI.ppt_第2页
C++面向对象高级特性及GWES图形GUI.ppt_第3页
C++面向对象高级特性及GWES图形GUI.ppt_第4页
C++面向对象高级特性及GWES图形GUI.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 高级特性及GWES图形系统 本次课程知识要点 一 静态友元与内联函数二 C 继承与派生类三 C 运算符重载四 C 多态与虚函数五 GWES图形系统 重点和难点 重点掌握C 继承 多态高级特性掌握Win32程序框架及消息机制难点C 虚函数的运用WinCE图形GWES机制 一 静态 友元与内联函数 1 1静态成员同一种 类 的对象如何实现数据共享呢 C 中可以将数据成员设置为静态数据成员来实现数据的共享 一个给定类的每个对象都有类中定义的所有数据的拷贝 如果在类中将数据成员用static说明为静态的 则这个类成员只有一个拷贝并被这个类的所有对象所共享 静态数据成员如果类的数据成员为静态的 称为静态数据成员 静态数据成员有下面两个特点 公有静态数据成员可被类的外部访问 保护或私有的静态数据成员只可被类的内部访问 静态数据成员是类的所有对象的共享例子 ClassDateExp staticintglbTotal 类中的静态函数如果类的成员函数使用static关键字声明为静态的 称为静态成员函数 同静态数据成员一样 静态成员函数也属于整个类 由一个类的所有对象共同维护 为这些对象所共享 作为成员函数 它的访问属性可以受到类的严格控制 对于公有的静态成员函数 可以通过类名或对象名来调用 而一般的非静态成员函数只能通过对象名来调用 静态成员函数可以直接访问该类的静态数据和函数成员 而访问非静态数据成员 必须通过参数传递方式得到对象名 然后通过对象名来访问 静态函数所有的对象共享 非静态成员为具体对象所有 例子 ClassDateExp FuncStatic 静态变量的生命周期 1 class的静态成员对象的生命期 class的静态成员对象随着第一个classobject的产生而产生 在整个程序结束时消亡 也就是有这样的情况存在 在程序中我们定义了一个class 该类中有一个静态对象作为成员 但是在程序执行过程中 如果我们没有创建任何一个该classobject 那么也就不会产生该class所包含的那个静态对象 还有 如果创建了多个classobject 那么所有这些object都共享那个静态对象成员 2 函数内部的静态变量 是当函数第一次调用时生成 程序结束时消失 1 2友元友元可以是一个函数 该函数称为友元函数 友元也可以是一个类 该类被称为友元类 友元函数是一种定义在类外的普通函数 但它需要在类体内进行说明 为了与该类的成员函数加以区别 在说明时前面加一关键字friend 友元函数不是成员函数 但是它可以访问类中的私有成员 友元的作用在于提高程序的执行效率 但是 它破坏了类的封装性和隐藏型 使得非成员函数可以访问类的私有成员 友元函数友元函数是能够访问类中的私有成员的非成员函数 友元函数从语法上看 它与普通函数一样 即在定义和调用上与普通函数一样 见例子classDateExp 友元类友元类 即一个类可以作另一个类的友元 当一个类作为另一个类的友元时 这就意味着这个类的所有成员函数都是另一个类的友元函数 1 3 内联函数类的成员函数可以分为内联函数和外联函数 内联函数是指那些定义在类内的成员函数 而说明在类内 实现在类外的成员函数叫外联函数 内联函数在调用时不是像一般函数那样要转去执行被调函数的函数体 执行完后再转回到调用函数 而是在调用函数处用内联函数体的代码来代替 这将会节省调用的开销 提高运行速度 在使用内联函数时 应注意如下两点 在内联函数内不允许使用循环语句 内联函数的定义必须出现在内联函数第一次被调用之前 inline不应该出现在函数的声明中inlineintCdate IsLeapYear return year 4 0 1 4构造函数初始化列表类名 构造函数名 参数表 成员初始化表 构造函数体 成员初始化表的一般形式为 数据成员名1 初始值1 数据成员名2 初始值2 A intx1 x x1 rx x pi 3 14 rx x 相当于rx x pi 3 14 相当于pi 3 14例子 exam1中的例子 二 C 继承与派生类 2 1为什么要使用继承 重用 通过继承机制 利用已有的类来定义新类 新的类不仅可以有新的成员 还拥有从已有的类继承来的成员 已有的类称为基类或父类 新的类称为派生类或子类 如果派生类从一个基类派生的 称这种继承为单继承 如果派生类从多个基类派生的 称这种继承为多继承 2 2派生类的声明 2 2 1派生类的定义格式为 class派生类名 继承方式基类名 派生类新定义成员 其中 继承方式有3种 public 公有派生 private 私有派生 缺省情况下也如此 protected 保护派生 参考例子程序employee hemployee cpp 2 2 2类的继承后方法属性变化使用private继承 父类的protected和public属性在子类中变为private 使用protected继承 父类的protected和public属性在子类中变为protected 使用public继承 父类中的protected和public属性不发生改变 继承方式public protected private public继承publicprotected不可用protected继承protectedprotected不可用private继承privateprivate不可用 2 2 3派生类的变异功能从已有类派生出新类时 可以在派生类内完成以下几种功能 可以增加新的数据成员 可以增加新的成员函数 可以重新定义基类中已有的成员函数 可以改变现有成员的属性 2 2 4派生类对基类成员的访问规则派生类对基类成员的访问形式主要有以下两种 内部访问 由派生类中新增成员对基类继承来的成员的访问 对象访问 在派生类外部 通过派生类的对象对从基类继承来的成员的访问 公有继承 否则对象无法访问 2 3派生类的构造函数和析构函数 派生类构造函数和析构函数的执行顺序当创建派生类对象时 首先执行基类的构造函数 随后再执行派生类的构造函数 当撤消派生类对象时 则先执行派生类的析构函数 随后再执行基类的析构函数 分析 基类Cperson与派生类employee构造和析构函数的执行顺序 派生类构造函数和析构函数的构造规则 构造函数不能够被继承 因此 派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象 所以 在定义派生类的构造函数时除了对自己的数据成员进行初始化外 还必须负责调用基类构造函数使基类数据成员得以初始化 如果派生类中还有基类子对象时 还应包含对基类子对象初始化的构造函数 派生类构造函数的一般格式如下 派生类名 派生类构造函数总参数表 基类构造函数 参数表1 子对象名 参数表2 派生类中数据成员初始化 派生类构造函数的调用顺序如下 基类的构造函数 子对象类的构造函数 如果有的话 派生类构造函数employee char dept floatfsalary char pname intiAge intiSex Cperson pname iAge iSex 当派生类中含有内嵌对象成员时 其构造函数的一般形式为 派生类名 参数总表 基类名 参数表1 内嵌对象名1 内嵌对象参数表1 内嵌对象名n 内嵌对象参数表n 其中 总参数表 中各个参数包含了其后的各个分参数表 派生类新增成员的初始化语句 请看 employee类中 增加了一个基类对象Cpersond后的构造顺序 2 4多继承 派生类只有一个基类 这种派生方法称为单基派生或单继承 当一个派生类具有多个基类时 这种派生方法称为多基派生或多继承 多继承的声明 有两个以上基类的派生类声明的一般形式如下 class派生类名 继承方式1基类名1 继承方式n基类名n 派生类新增的数据成员和成员函数 此部分内容 同学们可以课外自学 课内不讲了 三 C 函数 运算符重载 函数重载 概念 函数名相同 2 函数的参数及返回值不同 典型的有 构造函数重载 3 1运算符重载规则 运算符重载的函数一般地采用如下两种形式 成员函数形式和友元函数形式 这两种形式都可访问类中的私有成员 运算符重载的规则可重载的运算符除下列运算符不能重载外 几乎所有的运算符可用作重载 不能臆造新的运算符 必须把重载运算符限制在C 已有的运算符范围内的允许重载的运算符之内运算符重载后优先级和结合方向不变 也不改变运算符的语法结构 即单目运算符只能重载为单目运算符 双目运算符只能重载为双目运算符编译程序对运算符重载的选择遵循函数重载的选择规则 运算符重载形式 重载为类的成员函数的语法格式 类名operator运算符 其中 operator是定义运算符重载函数的关键字 例子complex重载 四个运算符 3 2友元函数运算符重载 友元运算符函数在C 中 可以把运算符重载函数定义成某个类的友元函数 称为元运算符函数 友运算符函数定义的语法形式友元运算符函数的原型在类的内部声明格式如下 ClassX friend返回类型operator运算符 形参表 在类外定义友元运算符函数的格式如下 返回类型operator运算符 形参表 函数体 友元运算符函数双目运算符重载友元函数不是类的成员函数 没有this指针 这样 用友元函数重载双目运算符时 友元函数有2个参数 重载单目运算符时 要有1个参数 当用友元函数重载双目运算符时 2个操作数都要传递给运算符函数 例子 friendcomplexoperator constcomplex 四 C 多态与虚函数 4 1C 多态性概述 多态性 封装性和继承性构成了面向对象程序设计的三大特性 多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为 即对应相同的函数名 却执行了不同的函数体 这种把函数名与其具体的实现代码相联系的过程 称为联编 多态的实现多态从实现的角度来讲可以划分为两类 编译时的多态和运行时的多态编译时的多态是通过静态联编来实现的 静态联编就是在编译阶段完成的联编 编译时多态性主要是通过函数重载和运算符重载实现的 运行时的多态是用动态联编实现的 动态联编是运行阶段完成的联编 运行时多态性主要是通过虚函数来实现的 4 2虚函数 虚函数提供了一种更为灵活的多态性机制 虚函数允许函数调用与函数体之间的联系在运行时才建立 也就是在运行时才决定如何动作 即所谓的动态联编 虚函数的格式virtual类型说明符函数名 参数表 其中 被关键字virtual说明的函数称为虚函数 如果某类中的一个成员函数被说明为虚函数 这就意味着该成员函数在派生类中可能有不同的实现 通过基类指针可以访问派生类对象成员函数 虚函数的作用虚函数同派生类的结合可使C 支持运行时的多态性 实现了在基类定义派生类所拥有的通用接口 而在派生类定义具体的实现方法 即常说的 同一接口 多种方法 它帮助程序员处理越来越复杂的程序 当基类中某个成员函数被定义为虚函数时 此函数就可以在一个或多个派生类中被重新定义 例子 point h rectangle h 4 3虚函数与重载函数的关系 在一个派生类中重新定义基类的虚函数是函数重载的另一种形式 但它不同于一般的函数重载 普通的函数重载时 其函数的参数或参数类型必须有所不同 函数的返回类型也可以不同 当重载一个虚函数时 也就是说在派生类中重新定义虚函数时 要求函数名 返回类型 参数个数 参数的类型和顺序与基类中的虚函数原型完全相同 如果仅仅返回类型不同 其余均相同 系统会给出错误信息 若仅仅函数名相同 而参数的个数 类型或顺序不同 系统将它作为普通的函数重载 这时将丢失虚函数的特性 C 语言总结 1 基本输入 输出格式 Cin Cout 2 New delete malloc free 之间的关系 3 引用的用法 引用是变量吗 引用与指针的关系 4 什么是类 什么是对象 类与对象的关系 类与结构的关系 对象中public private protected成员与函数之间的访问关系 5 对象初始化 构造函数 构造函数重载 6 析构函数的格式 7 类的静态成员 静态函数的特点及用法 静态成员的声明周期 8 定义内联函数注意事项 友元函数的特点 9 继承类的构造函数写法 顺序 10 运算符重载 友元运算符重载 11 多态与虚函数 虚函数与函数重载的区别 五 GWES图形系统 5 1GWES概述 GWES的全称为GraphicsWindowingandEventSubsystem 即图形窗口和事件子系统 GWES由GWES exe文件实现 GWES是用户应用程序和操作系统之间的图形用户接口 GWES是Win32应用编程接口 API 用户界面 UI 和图形设备接口 GDI 库的组合 5 2GWES的主要功能 通过键盘 笔针动作接受用户输入 将操作系统消息传送到应用程序 创建并管理在显示设备上的窗口 图形及文本的输出 5 3GWES的组件 GWES的核心是窗口 所有应用程序都须借助窗口来接受操作系统的消息 GWES模块是WindowsCE中最高度组件化的部分 包括两个子集USER 处理消息 事件 用户输入GDI 负责图形输出 5 4GWES的结构 GWES的三个关键部份图形系统 Graphic 窗口系统 Windows 事件系统 event 图形系统依赖窗口的上下文 DC 来绘图 而窗口也需要图形系统来绘制自身 事件是通过消息机制实现的 而消息总是要发送到某个窗口 而每个窗口都有一个WindProc来处理消息 5 5图形系统 图形系统使用图形设备接口GDI来处理程序的图形输出 GDI GraphicsDeviceInterface 用于控制文本和图形的显示 GDI可实现在显示设备 打印机及其他输出设备上输出图形或文本 GDI使程序员无需关心硬件设备和驱动的细节 就可以实现图形或文本的输出 实现GDI函数调用的关键是首先要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论