雷电面向对象第3章类_第1页
雷电面向对象第3章类_第2页
雷电面向对象第3章类_第3页
雷电面向对象第3章类_第4页
雷电面向对象第3章类_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 类面向对象程序设计的基本特征之一:封装上海大学 机自学院 雷电我正在看电视我正在看一个装置上演的戏, (不是舞台戏)是活动图像和声音,是一个矩形框的装置,(不是电影),是玻璃框, (不是投射的) 是通过天线接收电视台发射的电信号,再通过电子线路分离出视频信号和音频信号,分别通过荧光屏和喇叭还原为图像和声音这样交流太累了!要封装!上海大学 机自学院 雷电抽象百科名片:抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。程序设计的过程首先是一个抽象的过程(建模)类是对象的集

2、合体。类描述了一组有相同特性(数据元素)和相同行为(函数)的对象。上海大学 雷电1.2 类与抽象数据类型如何发现对象,抽象出概念(类型)?在我们日常词汇中的几乎每一个名词都表示一类对象,具有一组属性或行为特征 ,它是对现实世界的概括、分类和抽象。一个类是一种数据类型,是面向对象语言的基本模块。对象(变量)是类(数据类型)的实例。上海大学 雷电建模-现实世界的虚拟化(感兴趣方面的信息)上海大学 机自学院 雷电介绍类设计:面向现实世界,抽象出所关心的对象的行为和属性,定义其对象的类型,从而封装形成一个可复用的C+模块 - 方法论.上海大学 机自学院 雷电面向对象方法学起源于面向对象程序设计,是目前

3、最符合人类解决现实问题的思维模式和物理系统运行方式的软件开发方法学。特点 1) 以类作为基本的软件构件 类是一群具有共同特征和行为的对象,其模型中,数据和对数据的操作(函数)紧密结合。对象是一种包含了数据和行为(函数) ,并且良好封装的逻辑实体。整个软件由无数独立活动的对象构成,对象之间通过消息机制相互通信和相互作用。与现实世界中的实际系统更加吻合,是软件构建思想上的一次革命。2)软件定义和实现的统一整个软件的开发过程就是一次由粗到细构建对象模型的过程,使用循环迭代的方式来开发软件,这既符合人类对事物的认识模式,又可以尽早获得软件开发的概貌性结果,便于对软件需求进行验证。 上海大学 机自学院

4、雷电3)重视软件复用使用类来完成对象的定义,类还可以通过继承派生出新的类,因此面向对象方法学本质上就具备了良好的软件复用的基础,可以在不同软件中使用已有的类来派生出新的类,既利用了前人的软件开发成果,又可以根据每个软件的实际情况产生新的对象,结合对象完善的封装机制,实现对象模型的多层次、普遍的复用。4)通过逐步演化来完成软件开发使用循环迭代的方式来开发软件,整个软件系统是逐步精华的,这既符合人类对事物的认识模式,又可以尽早获得软件开发的概貌性结果,便于对软件需求进行验证。 上海大学 机自学院 雷电面向对象设计的C+语言描述classpublicprivateprotected成员变量(属性)成

5、员函数(方法)词汇- C+语言如何支持类的代码设计和代码实现?OOP 势如破竹,近乎每一种最新推出的程序开发工具或语言都采用了 OOP 思路; 面向对象编程 OOP 上海大学 机自学院 雷电使用类:1)类的实例化(创建对象).2)访问(操纵)其属性和行为, 传递数据请求(调用)服务3)组件的集成组装,对象间的通讯、交互对象人性化,在设计时尽可能把对象想象成绝顶聪明上海大学 机自学院 雷电语法一: 类的声明格式class 类名 public:protected:private:;上海大学 机自学院 雷电例:class Personpublic:void setAge(int a);int get

6、Age();private:int age;练习设计类:Student上海大学 机自学院 雷电语法二: 实现类内联式在类中声明函数的同时实现它.外联式返回类型 类名:成员函数(参数表)函数体上海大学 机自学院 雷电class Personpublic:void setAge(int age)this-age = age;int getAge()return age;private:int age; void Person :setAge(int a)age = a;int Person : getAge()return age;练习设计类:Student上海大学 机自学院 雷电语法三:类的实例

7、化,创建对象类是数据类型!创建类的实例(创建对象)生命期: 全局, 局部, 堆访问对象的成员.用 . 访问对象的成员用-访问所指对象的成员.上海大学 机自学院 雷电Person gpn;int main( ) Person pn; Person *p2=new Person; pn.setAge(20); p2-setAge(25);/delete p2;练习设计类:Student上海大学 机自学院 雷电面向对象设计的3种视图类的定义中使用修饰符的目的是为了封装性,简化了使用的难度。面向对象设计的三种视图,如同收音机:外部视图:使用类的对象者(使用收音机的人),只需关心收音机暴露的public

8、的成员的使用方法,对象能做的工作(开关,调谐等收音机怎样使用),而内部的一切不必关心。内部视图:类的扩展者(对收音机改造的人),还要关心protected成员使用方法(内部的可插拔件功能等),而其它private成员不必关心。内部核心视图:类的设计者(收音机制造人),关心一切,必须知道完成一个任务的一切逻辑。封装意味着对象内部是如何工作的对客户端编程人员来说是不可见的。如果没有封装性面对浩如烟海的数据或操作,哪能编程?上海大学 机自学院 雷电声明的可访问性public访问不受限制。protected访问仅限于当前类或从当前类派生出的类。private访问仅限于当前类型。若不使用访问修饰符,其默

9、认的可访问性是: private 上海大学 机自学院 雷电成员函数中如何访问本类的成员? -内部视图中访问对象 注意:类就是一种类型,不是对象!在没有创建对象时,其成员变量在内存中根本就没有,所以成员函数中看待成员变量,如同C+函数中看待参变量,参变量在函数被调用时有确定的内存并有值,成员变量在对象创建时有确定的内存并有值,于是可以访问这样的形式变量。在类的成员函数中访问当前类的成员,可直接访问。上海大学 机自学院 雷电-在外部视图中(客户端)访问对象 类是数据类型!创建类的实例(创建对象)生命期: 全局, 局部, 堆访问对象的成员.用 . 访问对象的成员用-访问所指对象的成员.上海大学 机自

10、学院 雷电例:绘图软件系统中的设计 Point 属性、行为/操作?那些信息暴露?隐蔽?Ex3_0练习:设计Circle圆上海大学 机自学院 雷电this 指针将函数也放在这个class包内,结构就变成了新的创造物,它既能描述属性(就像C中的struct 能做的一样),又能描述行为,这就形成了对象的概念。对象是一个独立的有约束的实体,有自己的记忆和活动。class Pointpublic: int x; int y; void MoveTo(int X,int Y) x=X; y=Y; void Draw( ); class Pointpublic: void MoveTo(int X,int

11、Y) int x=X; int y=Y; void Draw( ); int x ,int y;class Pointpublic: void MoveTo(int X,int Y) x=X; y=Y; void Draw( ); Point pt; pt.MoveTo(10,20); pt.Draw( );上海大学 机自学院 雷电对象的成员变量生命期与对象同在,能为所有成员函数共享.若有多个成员函数都要读写一个变量,他应该设计为成员变量.若一个类有一个成员变量x,那么N个类的每个实例,内存就有N个x变量.有N个成员函数吗?上海大学 机自学院 雷电this 指针N个类的每个实例(变量)并不意味

12、内存有N个类的成员函数。被产生的代码几乎和我们已经为C 库写的一样高效。xyxyMoveTo()this-x,this-y内存数据区代码区对象1对象2上海大学 机自学院 雷电类的成员函数代码对所有类的对象是相同的,它如何知道访问实际对象的成员?系统隐藏地传递了this 指针给类的非静态成员函数,它表示了实际对象的指针.在类的非静态成员函数中可以使用this 指针来访问类的非静态成员.this 指针不能被修改.上海大学 机自学院 雷电3.2 示例:堆栈类Stack 属性特征: 是缓冲区.最大缓存元素个数?属性 : 数组行为特征:先进后出行为: 元素压入、弹出元素stack.h上海大学 机自学院

13、雷电3.3 效率和健壮性3.3.1 通过引用传递或返回对象P83 3-143.3.2 const 型的对象参数3.3.3 const 成员函数3.3.4 字符串参数P85 Ex3_1_1练习P85作业:P126 3-1 Ex3_1上海大学 机自学院 雷电3.5 构造函数和析构函数3.5.1 构造函数函数名同类名,无返回类型,其他同一般的成员函数.总是被最先调用Ex: Stack3.5.11 析构函数函数名:类名,无返回类型,无参数,至多只能有一个.总是被最后自动调用一般在构造函数中动态分配内存,在析构函数中释放其内存。Ex: Stack(动态分配实现的)上海大学 机自学院 雷电3.5.2 对象

14、数组与默认构造函数class C public: C( ) ;C c;C cs100;C *pcs=new C;带参数的构造函数class C public: C( ) C( int x, int y) ;构造函数支持重载机制C c(1,2); /调带参数的构造函数C cs =C(1,1),C(2,2); C *pc=new C( ); /调默认的构造函数C *pc1=new C(2,3); /调带参数的构造函数若没有定义任何构造函数系统提供默认构造函数,否则不会提供.上海大学 机自学院 雷电3.5.7 转型构造函数如定义了: Person(string psn);于是可以隐式类型转换: Pe

15、rson wang=“wang wei”; 又如: void func(Person psn)string wang= “wang wei”; func(wang);而 explicit Person(string psn);可阻止这种转换,只能 Person wang(“wang wei”);例:Ex3_4上海大学 机自学院 雷电3.5.4 拷贝构造函数创建对象问题,如:Person psn2=psn1; 或 Person psn2(psn1); 编译器自动提供的拷贝拷贝构造函数是对数据成员逐一拷贝.当类Person 中某个成员是指针,那么对象psn2、psn1不再是完全独立的实体.例:例:

16、Ex3_4缺省下数据成员逐一拷贝将造成三个错误:1. 对象拷贝时,原有的p没有释放就修改到指向另一个内存区。2. 两对象的p指向同一个内存区,相互影响。3.在对象被析构时,p 被释放了两次。上海大学 机自学院 雷电为了避免指针值的拷贝,需要自定义拷贝构造函数:其设计方法如:class Person public:Person(Person &psn);Person(const Person &psn);注意:拷贝构造函数的参数却必须是引用于是创建对象:Person psn2(psn1); /触发拷贝构造函数的调用。Person psn2=psn1; /触发拷贝构造函数的调用。Person ps

17、n3;psn3=psn1; /缺省仍为数据逐一拷贝赋值,要避免此,应提供对=操作的重载。例:p96 namelist.cpp不要轻视拷贝构造函数与赋值函数上海大学 机自学院 雷电3.5.9 构造函数的初始化段class C .;int x; int y;public:C (int a): x(a),y(0);3.5.10 构造函数与new delete析构造函数顺序:Ex3_35上海大学 机自学院 雷电3.4 实例 时间标记类TimeStamp需求:解析时间字符串,GetDate、GetTimeSYSTEMTIMEGetLocalTimememcpysprintfsscanf例:TimeEx上

18、海大学 机自学院 雷电3.7 静态成员访问方法同非静态成员,还可以通过作用域分辨符.他们是属于类的,而不是属于对象的.Ex3_37静态成员变量具有全局生命期,外部连接属性,要通过作用域分辨符在外部创建实例.类的所有实例共享其静态数据成员.静态函数静态函数中不能访问非静态成员,因为没有this指针上海大学 机自学院 雷电struct 和 classC+中: struct 和 class相同,但struct中的所有成员都是公有的.C/C+语言的面向对象设计方法struct SObj int v;void m(SObj *pobj,int a) pobj-v =a;class CObj int v;

19、Public: void m(int a);void CObj:m(int a) this-v=a;int main() SObj obj1; m(&obj1,0); CObj obj2; obj2-m(0); int d=sizeof(SOj)-izeof(CObj);上海大学 机自学院 雷电变量成员变量局部变量全局变量静态变量自动对象堆对象int a;class Cint a;void func(int a ) static int s=0;int *p=new int10;可见性,生命期?上海大学 机自学院 雷电函数成员函数静态成员函数全局函数上海大学 机自学院 雷电编程作业:P128

20、3-15上海大学 机自学院 雷电设计要点:1)封装.2)服务DataSet类成员1)DataTable * newTable(string tableName);功能: 创建表参数: tableName: in 要创建的表名.返回:成功:返回创建的表对象地址失败:返回NULL? DataTable newTable(string tableName); ? DataTable & newTable(string tableName); ? bool newTable(string tableName, DataTable &table);? bool newTable(string tableName, DataTable *ptable);? int newTable(string tableName, DataTable *pptable); ? bool newTable(string tableName, DataTable *& ptable); 2)void printTable( string tableName);功能: 打印表上海大学 机自学院 雷电DataTable1)void se

温馨提示

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

评论

0/150

提交评论