版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,复习:面向对象基本概念及特点,一、对象 对象定义:对象是一个逻辑实体,它是对一组信息以及作用于这些信息的操作的描述 对象特性: 名字 状态 操作 对象的属性:对象需要记忆的特征或数据 例:对象“人” ,属性有:姓名、生日、身高、ID号 对象的状态由属性的值决定 对象的属性只能由“自己”的函数改变,2,二、类:具有共同特点的一组对象的抽象,类是一个抽象的概念,用来描述某一类对象所共有的、本质的属性和行为。,类,3,三、面向对象系统的特点,一封装性 目的是隐藏对象内部的实现细节,将对象的外部接口与内部的实现细节清楚的分开。 比如: 售报亭的属性是亭内的各种报刊(名称、售价)和钱箱(总金额),他
2、有两个服务:报刊零售和款货清点。如图: 这些属性和服务被封装成一个整体,通过一个接口(售报窗口)提供报刊零售业务。顾客只能通过该窗口要求服务(买报刊),不能自己伸手到亭内拿报纸和找零钱。款货清点是一个内部服务,不对顾客开放。,顾客,4,再比如,一个银行账户类的对象中,balance、interestYTD、name、accountID等私有数据是被封装的数据,MakeDeposit、WithDraw、Transfer等成员函数的细节也同时被封装,用户看到的是三个成员函数提供的接口。如图:,用户只能通过接口请求存款、取款或转账服务。不能直接对账号、余额等数据进行操作,也无须知道存款等操作的具体实
3、现细节。,5,封装的优点:隐藏了复杂性, 提供了代码重用性, 实现了模块的独立性。,具体地说,对象的封装机制,可以将对象的使用者与设计者分开,使用者不必知道对象行为的实现细节,只需要使用设计者提供的接口让对象去做即可。 同时,当对象内部需要修改时,一般不需要改变外部接口,而只需要对成员函数的实现细节作修改,因此大大减少了因内部修改对外部造成的影响,即减小了修改引起的“波动效应”。也加强了模块之间的独立性。 比如,当银行的存款、取款或转账过程发生改变时。,6,二、继承,继承是一个对象可以获得另一个对象的特性的机制,它支持层次分类的概念。 将被继承的对象称为基类或父类,而继承的对象称为派生类或子类
4、。 如果父类中的某些行为不适用于子类,则只需对这些操作的实现部分加以修改和重写,以满足子类的要求。 父类可以继承其它的类,子类也可以被别的类所继承,从而形成类的继承层次关系,也称为类层次。,7,二 继承性,如右图:从上到下的继承关系是: 奔驰是轿车,轿车是汽车。 “奔驰”类继承了“轿车”类的特性,“轿车”类继承了“汽车”类的特性。 在面向对象的程序设计中,继承所表达的是类之间的关系。这种关系使的某类对象可以继承他的基类对象的特征和能力。 轿车类是从汽车类派生出来的,则汽车类是基类(或父类、或超类),而轿车类是汽车类的子类或派生类。 汽车类是轿车类的直接基类,是奔驰类的间接基类。,8,继承的作用
5、:避免公用代码的重复开发,减少代码和数据冗余。同时通过增强一致性来减少模块间的接口和界面。,具体地说,在软件开发中,如果类B是类A的派生类,那么,在构造类B的时候,我们不必重新描述类A的所有特征,我们只需声明它是类A的派生类,并定义与基类A不同的那些属性与服务。同时,在定义派生类时,我们还可以修改或重定义基类中的操作。 比如,子女类可以从父母类继承房子和汽车,当然可以使用房子和汽车,还可以对房子和汽车进行再装修。,小结:继承机制为程序员提供了一种组织、构造和重用类的手段。,9,单继承和多继承: 每个类只有一个父类为单继承,若某个类有多于一个的基类,称为多继承 采用继承性的语言具有如下的优点:
6、1. 提高了软件的重用性。 2. 符合逐步求精的软件工程原则。 3. 便于实现多态性。 4. 便于系统的扩展。 5. 类层次反映了现实世界中普遍存在的一般与特殊的关系,也反映了人类认识世界的演绎方法,10,三 多态性,现实世界的多态性: 1)同样是“取款”请求,活期、定期储蓄的“取款”操作和“存本取息”的取款执行的操作是不同的。 2)同样是“求最大值”,当参数为2个时和参数为3个时所执行的操作也是不同的。 3)同样是“挪开”,把汽车挪开与把凳子挪开所执行的操作也是不同的。 共性:相同的请求,对应不同的行为。,11,面向对象程序设计中的多态性:不同的对象收到相同的消息时产生多种不同的行为方式。,
7、C+支持两种多态性: 编译时的多态性和运行时的多态性。 编译时的多态性是通过重载来实现的,运行时的多态性是通过虚函数来实现的。,12,类的定义 类是对一组具有共同属性的事物的抽象。 从语言角度讲,类是一种自定义的数据类型,其中既包含有描述其属性的数据,又有处理这些数据的操作(函数),它是C+封装的基本手段。 在程序的构成上,类形成了一个具有特定功能的模块和一种代码共享的手段。,13,2020/9/7,13,14,1.类的定义,定义类的一般格式为: class private : 私有数据成员和成员函数 public: 公有数据成员和成员函数 protected: 保护数据成员和成员函数 ;,1
8、5,一对大括号内是类的说明部分,称为类体;类体后面的分号表示类定义的结束。 类体中定义的数据和函数称为该类的成员,分为成员数据和成员函数两部分。 用关键字private限定的成员称为私有成员,私有成员只限定在该类的内部使用; 用关键字public限定的成员称为公有成员,公有成员可以被类中的成员函数和类外的函数调用; 用关键字protected限定的成员称为保护成员, 对保护成员的访问要求与私有成员类似。 p21例2.1 类成员访问控制举例,16,关键字private、public、protected的作用仅仅是限定成员的访问权限,在类体中的顺序无关紧要,同一个关键字在类体中可以被反复使用。其中
9、private为类所默认的关键字,即在类体中没有明确地指定成员的访问权限时,系统约定这些成员为私有成员。 限定访问权限的关键字的限定范围为:从该关键字后的第一个成员开始,到下一个限定访问权限的关键字之间的所有的成员。 类中的成员顺序也是无关紧要,且在前面定义的成员函数可以访问在后面定义的成员。 类可以嵌套定义。,17,2.类的构成,类的成员可分为两类:成员数据或成员函数。 类的成员数据在类体内定义,它的定义方式和变量的定义方式相同。 必须注意,在定义类时,不能对类中的成员数据初始化。 另外,类中的成员数据不能使用关键字extern、auto以及register等(static除外)来限定其存储
10、类型。,18,成员函数的定义,成员函数,即面向对象技术中的“方法”,或“行为”。 成员函数的定义有两种方式: 1)在类的定义中直接定义成员函数的函数体(如下例,这样的成员函数自动成为内联函数)。 适用场合:当成员函数很简单时,最适合写成内联函数以提高程序的执行效率。,19,在类体内实现的成员函数都是内联函数,称为内联成员函数, 在类体外实现的成员函数称为外联成员函数,但是可以在函数实现时在其函数名前加上关键字inline表示该函数是内联成员函数。 在类体外定义成员函数,一定要在成员函数前加上“类名:” ,运算符“:”称为作用域运算符或作用域限定符。,20,类中的成员具有类作用域,即成员的有效范
11、围为整个类体,类的成员函数可以访问类中的任何成员,且不受位置的限制,即在类中先定义的成员函数可以访问后定义的其它成员 成员函数的设计: 1.为每个数据成员设计一个set函数和get函数; 2.根据需要,设计特殊目的的函数。 例1:定义一个复数类型,包含实部和虚部,能对该类型的对象赋初值、求实部、求虚部、求复数的绝对值,21,方法一:在类中定义成员函数。 建立项目后,用File/New中的Files标签中的 C+ source file ,输入文件名生成一空白文件,然后在空白文件中输入以下代码: 程序说明: 将数据成员声明为私有的,可以阻止外界对他们的随意访问,只有该类中的成员函数才能访问。 将
12、成员函数声明为公有的,他们便是外界访问类中数据的接口。,22,成员函数的定义方法二,2)在类的定义中只给出成员函数的原型,而将成员函数的定义放在类的外部。此时,定义成员函数的一般形式为: : () 函数体 其中,作用域运算符“:”指出成员函数的类属。 没有类属的函数称为公共函数,如前面各章中用到的函数,在项目工作区中的globals目录中。 特别提示: 通常将类的定义放在头文件(*.h)中,将成员函数的定义放在一起构成一个源程序文件(*.cpp),23,例2:定义一个Person类,包含属性: 姓名、年龄、性别(0:male, 1:female);并包含对属性操作的方法:登录一个人的信息Reg
13、ister(),获取一个人的某项信息的函数GetAge()、GetName()、GetSex()。,方法: 1)添加一项目 2)在该项目中添加头文件Person.h,包含类的定义 3)在项目中添加源程序文件Person.cpp,包含类的成员函数的定义。 4)在项目中添加一源程序文件,包含公共函数main,使用该类定义对象并进行操作。,24,/person.h:定义类Person class Person private: char m_Name20; int m_Age; int m_Sex; public: void Register(char *name, int age, char se
14、x); void GetName(char *name); int GetAge( ); char GetSex( ); ;,25,/person.cpp:定义类Person的成员函数 #include #include person.h void Person:Register( char *name, int age, char sex) strcpy(m_Name,name); m_Age=age; m_Sex=(sex=m?0:1); void Person:GetName(char *name) strcpy(name,m_Name); int Person:GetAge() ret
15、urn m_Age; char Person:GetSex() return (m_Sex=0?m:f);,26,/ex_mm.cpp:调用Person类,实现人事资料的输入输出 #include #include person.h void main() void OutPersonData(Person a); char name20,sex; int age; Person p1, p2; /定义对象p1,p2 coutnameagesex; p1.Register(name,age,sex); p2.Register(zhang3, 19 , m); coutperson1:t; Ou
16、tPersonData(p1);,27,coutperson2:t; OutPersonData(p2); p2=p1; coutperson2:t; OutPersonData(p2); void OutPersonData( Person p) char name20; p.GetName(name); coutnametp.GetAge()tp.GetSex()endl; ,28,运行结果: enter a persons name,age and sex:wang2 20 f person1: wang2 20 f person2: zhang3 19 m person2: wang2
17、 20 f Press any key to continue,29,关于类的定义的说明,1)类的声明中的private 、protected和public 关键字的顺序可以任意,可以出现多次。一般将私有成员和公有成员归类放在一起,并且习惯上将私有成员放在公有成员的前面。(因为一旦用户忘记了使用说明符private,由于缺省值是private,用户的数据仍然能得到保护)。 2)类中的数据成员都不能用关键字auto、extern、register进行修饰。 3)不能在类的定义中给数据成员赋初值,例如: class aa char a=r; /error int b=44; /error publ
18、ic: ;/因为类是一种数据类型,不是变量(对象),30,对象,对象:是类的实例,一个对象实际上是一个具有某种类型的变量。与普通变量一样,也必须先定义,后使用。 定义对象的一般形式为: , 如上例中的语句: Person p1, p2; complex A; 还可以在定义类的同时创建对象:P226 可以在创建时为公有成员赋值,31,对象的存储,当用一个类创建多个对象时,编译系统分别为各对象中的成员数据分配存储空间,而这些对象的成员函数的代码却是共享的。,32,对象的使用:,是指对对象成员的引用(包括数据成员和成员函数)。 一般格式为: . 或 . () 这里的符号“.”称为成员选择运算符。 对象只能通过公有成员函数间接地访问其私有成员或保护成员。 【例9.3】,33,成员函数引用同类中的成员时,可以直接使用数据成员名或成员函数名。(如前例) 外部函数不能直接引用对象的私有成员,否则属于非法操作。例如: Person p; p.m_age=20; /error 同类对象之间可以整体赋值。 例如:Person p1, p2; p1.Register(“li4”, 18, f); p2=p1; 通常,为了区别普通的变量名,在数据成员名前加一个前缀:“ m_” 例如:m_Sex 数据成员名、成员函数名中适当使用大写字母,以提高可读性。例如: Person m_Name O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西桂林市社会保险事业管理中心招聘公益性岗位人员1人备考题库含答案详解【综合题】
- 2026河南郑州市郑东新区春华学校、郑州市郑东思贤学校招聘备考题库及参考答案详解(综合题)
- 2026年黑龙江幼儿师范高等专科学校附属第二幼儿园招聘备考题库(综合卷)附答案详解
- 2025-2026学年高一上册物理教学设计
- 2026吉林大学中日联谊医院(白求恩第三医院)非编岗位人员招聘3人备考题库【26-3】含完整答案详解(夺冠系列)
- 2026浙江农林大学继续教育学院劳务派遣工作人员招聘1人备考题库带答案详解(培优b卷)
- 2026四川高能智盾科技有限公司招聘系统工程师(系统集成方案解决岗)等岗位70人备考题库【历年真题】附答案详解
- 2026西藏阿里地区日土县审计局招聘3名备考题库及完整答案详解
- 2026河北邯郸幼儿师范高等专科学校春季博硕人才选聘26人备考题库带答案详解(精练)
- 2026广西河池大化瑶族自治县实验中学德育工作辅助人员招聘1人备考题库附参考答案详解(完整版)
- 云南省事业单位统考《职业能力倾向测验A类》真题及答案解析
- 医学检验技术职业道德
- 2025年爆破公司自查自纠报告及整改措施范文
- 初中安全教育教案(10篇)
- 幼儿园谷雨课件
- 量子计算入门:通过线性代数学习量子计算 课件 第11章 量子傅里叶变换
- 园区党组织管理制度
- 2025年四川省泸州市中考道德与法治真题(附答案解析)
- 2025届河北省邢台市英语八下期末联考试题含答案
- CJ/T 107-2013城市公共汽、电车候车亭
- 心电图基础知识与识图理论考核试题题库及答案
评论
0/150
提交评论