




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
长 春 工 业 大 学 课 程 教 案讲 稿 用 纸讲 授 内 容教学设计备注第4章 类和对象学习目的l 掌握类的基础知识l 掌握如何使用对象l 掌握构造函数和析构函数l 掌握内联成员函数l 掌握类的组合学习要点l 类的特点、类的声明、类作用域、类成员函数设计l 类成员的访问权限l 对象的定义方法l 对象的数据成员访问方法l 对象的成员函数调用方法l 类对象的存储空间l 构造函数特点及设计方法l 析构函数特点及设计方法l 对象的生存期l 对象的浅复制与深复制l 类的组合4.1 类4.1.1类的声明类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体。类将一些数据及与数据相关的函数封装在一起,使类中的数据得到很好的“保护”。在大型程序中不会被随意修改。类的定义格式:class 类名 /类界面 private : 数据成员和成员函数; public : 数据成员和成员函数; protected: 数据成员和成员函数;;各个成员函数的实现; /类实现用关键字priviate限定的成员称为私有成员,对私有成员限定在该类的内部使用,即只允许该类中的成员函数使用私有的数据成员,对于私有的成员函数,只能被该类内的成员函数调用;类就相当于私有成员的作用域。如果未加说明,类中成员默认的访问权限是private,即私有的。用关键字public限定的成员称为公有成员,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的。用关键字protected所限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数。即保护成员的作用域是该类及该类的派生类。私有成员公有成员保护成员类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用私有函数公有函数保护函数类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用每一个限制词(private等)在类体中可使用多次。一旦使用了限制词,该限制词一直有效,直到下一个限制词开始为止。4.1.2成员函数类的成员函数描述的是类的行为或操作。如果在类的内部定义成员函数的具体实现,则该成员函数为内联成员函数。在类外部实现的成员函数中,对编译提出内联要求,成员函数定义前面加inline。如果在类的外部定义成员函数的具体实现,函数的原型声明在类的主体中,原型说明了函数的参数表和返回值类型,而函数的具体实现写在类声明之外。在类的外部定义成员函数的语法形式为:返回值类型 类名:成员函数名(参数表) 函数体 4.2 对象在定义类时,只是定义了一种数据类型,即说明程序中可能会出现该类型的数据,并不为类分配存储空间。只有在定义了属于类的变量后,系统才会为类的变量分配空间。类的变量我们称之为对象。对象是类的实例,定义对象之前,一定要先说明该对象的类。不同对象占据内存中的不同区域,它们所保存的数据各不相同,但对成员数据进行操作的成员函数的程序代码均是一样的。 4.2.1对象的定义格式类名 对象名表;在建立对象时,只为对象分配用于保存数据成员的内存空间,而成员函数的代码为该类的每一个对象所共享。 定义一个对象和定义一个一般变量相同。 定义变量时要分配存储空间,同样,定义一个对象时要分配存储空间,一个对象所占的内存空间是类的数据成员所占的空间总和。类的成员函数存放在代码区,不占内存空间。4.2.2对象的使用一个对象的成员就是该对象的类所定义的成员,有数据成员和成员函数,引用时同结构体变量类似,用“.”运算符。用成员选择运算符“.”只能访问对象的公有成员,而不能访问对象的私有成员或保护成员。若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。调用成员形式:对象名.成员;4.2.3 对象的存储空间C+只为每一个对象的数据成员分配内存空间,类中的所有成员函数只生成一个副本,而该类的每个对象执行相同的函数成员副本。类的所有成员函数均放在公用区中(只保存一份),每个函数代码有一个地址,类的每个对象中只存放自己的数据成员值和指向公共区中对应函数的地址,即类的成员函数是共享的。4.2.4例题1.设计一个日期类Date,包括年、月、日等私有数据成员,要求实现对日期的设置及输出显示。(显示格式为“月-日-年”)#include using namespace std;class Datepublic:void setDate(int y,int m,int d);void showDate();private:int year,month,day;void Date:setDate(int y,int m,int d)year=y;month=m;day=d;void Date:showDate()coutmonth-day-yearendl;int main()Date D;int year,month,day;coutyearmonthday;D.setDate(year,month,day);D.showDate();return 0;2.设计一个学生类Student,包括学生的学号,姓名,年龄,家庭住址信息,要求设置并输出这些学生的信息。 #include #includeusing namespace std;class Studentpublic:void setStudent(int n,char na,int a,char addr);void showStudent();private:int no;char name20;int age;char address50;void Student:setStudent(int n,char na,int a,char addr)no=n;strcpy(name,na);age=a;strcpy(address,addr);void Student:showStudent()coutno name age addressendl;int main()Student std;std.setStudent(1,Mary,20,吉林省长春市);std.showStudent();return 0;4.3 构造函数和析构函数4.3.1 构造函数定义在定义一个对象的时候进行的数据成员设置,称为对象的初始化 。构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。 构造函数在对象被创建的时候将被自动调用。如果程序中未声明,则系统自动产生出一个隐含的参数列表为空的构造函数。 定义构造函数的一般形式为:class 类名public: 类名(形参表); /构造函数的原型 /类的其它成员;类名:类名(形参表) /构造函数的实现/函数体 类的构造函数承担对象的初始化工作,它旨在使对象初值有意义。对构造函数,说明以下几点:1. 构造函数的函数名必须与类名相同。构造函数的主要作用是完成初始化对象的数据成员以及其它的初始化工作。2. 在定义构造函数时,不能指定函数返回值的类型,也不能指定为void类型。3. 在类的内部定义的构造函数是内联函数。构造函数可以带默认形参值,也可以重载。一个类可以定义若干个构造函数。当定义多个构造函数时,必须满足函数重载的原则。类对象创建时,构造函数会自动执行;由于它们没有类型,不能像其他函数那样进行调用。当类对象说明时调用哪一个构造函数取决于传递给它的参数类型。4. 若定义的类要说明该类的对象时,构造函数必须是公有的成员函数。如果定义的类仅用于派生其它类时,则可将构造函数定义为保护的成员函数。由于构造函数属于类的成员函数,它对私有数据成员、保护的数据成员和公有的数据成员均能进行初始化。4.3.2 调用构造函数当定义类对象时,构造函数会自动执行。1.调用默认构造函数调用默认构造函数的语法: 类名 类对象名;在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该对象。默认构造函数并不对所产生对象的数据成员赋初值;即新产生对象的数据成员的值是不确定的。 关于默认构造函数,说明以下几点:1、在定义类时,只要显式定义了一个类的构造函数,则编译器就不产生默认构造函数。2、所有的对象在定义时必须调用构造函数,不存在没有构造函数的对象!3、在类中,若定义了没有参数的构造函数,或各参数均有缺省值的构造函数也称为默认构造函数,默认构造函数只能有一个。4、产生对象时,系统必定要调用构造函数。所以任一对象的构造函数必须唯一。2.调用带参数的构造函数调用带参数的构造函数的语法如下:类名 类对象名(参数表)参数表中的参数可以是变量,也可以是表达式。 3. 一次性对象创建对象如果不给出对象名,也就是说,直接以类名调用构造函数,则产生一个无名对象。无名对象经常在参数传递时用到。例如:cout Date(2003,12,23); Date(2003,12,23)是一个对象,该对象在做了操作后便烟消云散了,所以这种对象一般用在创建后不需要反复使用的场合。4. 用构造函数初始化对象的过程用构造函数初始化对象的过程,实际上是对构造函数的调用过程。一般按如下步骤进行:(1)程序执行到定义对象语句时,系统为对象分配内存空间。(2)系统自动调用构造函数,将实参传送给形参,执行构造函数体时,将形参值赋给对象的数据成员。完成数据成员的初始化工作。4.3.3 复制构造函数用于将一个已知对象的数据成员复制给正在创建的另一个同类的对象。格式如下:类名:复制构造函数(类名 &引用名)或 类名:复制构造函数(const 类名 &引用名)如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。但是,当类中的数据成员中使用new运算符,动态地申请存储空间进行赋初值时,必须在类中显式地定义一个完成拷贝功能的构造函数,以便正确实现数据成员的复制。拷贝构造函数就是函数的形参是类的对象的引用的构造函数。 如果程序在类定义时没有显式定义拷贝构造函数,系统也会自动生成一个默认的拷贝构造函数,把成员值一一复制。拷贝构造函数与原来的构造函数实现了函数的重载。在以下3中情况下,复制构造函数都会被调用: 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。 当函数的返回值是类对象时,系统自动调用拷贝构造函数。4.3.4析构函数C+程序设计的一个原则是:由系统自动分配的内存空间由系统自动释放。而手工分配的内存空间必须手工是否,否则可能造成内存泄漏。人为的动态内存释放工作由析构函数来完成,它的意义是做关于对象本体失效之前瞬间的善后工作。这与构造函数的工作正好相反,当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间,所以给它取的名字也是波浪“”号加上类名,以示与构造函数在功能上的对应关系。析构函数与构造函数是成对出现的。析构函数是在对象生存期即将结束的时刻由系统自动调用的。显式定义析构函数格式为:类名:析构函数名( ) 语句; 若在类的定义中没有显式地定义析构函数时,系统将自动生成和调用一个默认析构函数,其格式为:类名:默认析构函数名( ) 任何对象都必须有构造函数和析构函数,但在撤消对象时,要释放对象的数据成员用new运算符分配的动态空间时,必须显式地定义析构函数。 析构函数的特点如下:1、析构函数是成员函数,函数体可写在类体内,也可写在类体外。2、析构函数是一个特殊的成员函数,函数名必须与类名相同,并在其前面加上字符“”,以便和构造函数名相区别。3、析构函数也是类的一个公有成员函数,不能带有任何参数,不能有返回值,不指定函数类型。4、一个类中,只能定义一个析构函数,析构函数不允许重载。5、析构函数是在撤消对象时由系统自动调用的。在程序的执行过程中,当遇到某一对象的生存期结束时,系统自动调用析构函数,然后再收回为对象分配的存储空间。对象在定义时自动调用构造函数,生存期即将结束时调用析构函数!4.4 类的组合4.4.1类的组合类中的成员数据是另一个类的对象。可以在已有抽象的基础上实现更复杂的抽象。原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。声明形式:类名:类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数),. 本类初始化 类组合的构造函数调用l 构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反)l 初始化列表中未出现的内嵌对象,用默认构造函数(即无形参的)初始化 l 系统自动生成的隐含的默认构造函数中,内嵌对象全部用默认构造函数初始化 4.4.2 前向引用声明l 类应该先声明,后使用l 如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。l 前向引用声明只为程序引入一个标识符,但具体声明在其他地方。使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。4.5 UML简介UML语言是一种可视化的的面向对象建模语言。UML有三个基本的部分事物(Things)UML中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素关系(Relationships)关系把事物紧密联系在一起图(Diagrams)图是很多有相互相关的事物的组UML中有4种类型的事物l 结构事物(Structural things)l 动作事物(Behavioral things)l 分组事物(Grouping things)l 注释事物(Annotational things)UML中的关系l 依赖(Dependencies) l 关联(Association) l 泛化(Generalization) l 实现(Realization)UML中的9种图l 类图(Class diagram)l 对象图(Object diagram)l 用例图(Use case diagram)l 顺序图(Sequence diagram)l 协作图(Collaboration diagram)l 状态图(Statechart diagram)l 活动图(Activity diagram)l 组件图(Component diagram)l 实施图(Deployment diagram)4.5.1类图举例:Clock类的完整表示Clock类的简洁表示UML规定数据成员表示的语法为: 访问控制属性名称重数:类型=默认值约束特征 这里必须至少指定数据成员的名称,其他都是可选的。 访问控制属性:public,private,protected分别对应于+,-,# 名称:表示数据成员的字符串 重数:可以在名称后面的方括号内添加属性的重数 类型:表示给数据成员的种类,可以是基本数据类型,也可以为用户自定义类型,还可以是某一个类。 默认值:赋予该数据成员的初始值。 约束特征:用户对该数据成员性质约束的说明,如只读4.5.2对象图 4.5.3类与对象关系的图形标识l 依赖关系图中的“类A”是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目立项阶段咨询评估合同书
- 木材竞价销售方案(3篇)
- 药用仓库设计方案(3篇)
- 工会产品配送方案(3篇)
- 电子商务平台的用户数据保护合同
- 生态拦截工程方案(3篇)
- 钢结构楼面吊装方案(3篇)
- 消防窗户整改方案(3篇)
- 员工大澡堂管理方案(3篇)
- 甘泉公路安全生产方案(3篇)
- 国企返聘人员管理办法
- 2025年高考真题-政治(云南卷) 含答案
- 2025年全国高中物理竞赛试题及答案
- 药品注册培训课件
- 2025电力现代供应链与仓储管理
- 2025年外企德科人力资源服务招聘笔试参考题库含答案解析
- 尿毒症护理疑难病例讨论
- 回肠造口还纳护理查房
- 2025年陕西西安工业投资集团有限公司招聘笔试参考题库含答案解析
- CJ/T 341-2010混空轻烃燃气
- 存款代为保管协议书
评论
0/150
提交评论