《2022年c教案第三章类与对象 .pdf》由会员分享,可在线阅读,更多相关《2022年c教案第三章类与对象 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、7 长 春 工 业 大 学 课 程 教 案讲 稿 用 纸讲授内容教学设计备注第 4 章 类和对象学习目的掌握类的基础知识掌握如何使用对象掌握构造函数和析构函数掌握内联成员函数掌握类的组合学习要点类的特点、类的声明、类作用域、类成员函数设计类成员的访问权限对象的定义方法对象的数据成员访问方法对象的成员函数调用方法类对象的存储空间构造函数特点及设计方法析构函数特点及设计方法对象的生存期对象的浅复制与深复制类的组合4.1 类4.1.1类的声明类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体。类将一些数据及与数据相关的函数封装在一名师资料总结-精品资料欢迎下载-名师
2、精心整理-第 1 页,共 14 页 -8 起,使类中的数据得到很好的“保护”。在大型程序中不会被随意修改。类的定义格式:class 类名 /类界面private:数据成员和成员函数;public:数据成员和成员函数;protected:数据成员和成员函数;;各个成员函数的实现;/类实现用关键字 priviate 限定的成员称为私有成员,对私有成员限定在该类的内部使用,即只允许该类中的成员函数使用私有的数据成员,对于私有的成员函数,只能被该类内的成员函数调用;类就相当于私有成员的作用域。如果未加说明,类中成员默认的访问权限是private,即私有的。用关键字 public 限定的成员称为公有成员
3、,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的。用关键字 protected所限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数。即保护成员的作用域是该类及该类的派生类。私有成员公有成员保护成员类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用私有函数公有函数保护函数类内函数可以调用可以调用可以调用类外函数不可调用可以调用不可调用每一个限制词(private 等)在类体中可使用多次。一旦使用了限制词,该限制词一直有效,直到下一个限制词开始为止。1、类具有封装性,并且类只是定义了一种结构(样板),所以类中的任何成员数据均不能使用
4、关键字 extern,auto或register 限定其存储类型。2、在定义类时,只是定义了一种导出的数据类型,并不为 类 分 配 存 储 空间。所以,在定义类 中 的 数 据 成 员时,不能对其初始化。如:class Test int x=5,y=6;/是不允许的extern float x;/是不允许的 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 14 页 -9 4.1.2成员函数类的成员函数描述的是类的行为或操作。如果在类的内部定义成员函数的具体实现,则该成员函数为内联成员函数。在类外部实现的成员函数中,对编译提出内联要求,成员函数定义前面加 inline。如果在类的外
5、部定义成员函数的具体实现,函数的原型声明在类的主体中,原型说明了函数的参数表和返回值类型,而函数的具体实现写在类声明之外。在类的外部定义成员函数的语法形式为:返回值类型类名:成员函数名(参数表)函数体 4.2 对象在定义类时,只是定义了一种数据类型,即说明程序中可能会出现该类型的数据,并不为类分配存储空间。只有在定义了属于类的变量后,系统才会为类的变量分配空间。类的变量我们称之为对象。对象是类的实例,定义对象之前,一定要先说明该对象的类。不同对象占据内存中的不同区域,它们所保存的数据各不相同,但对成员数据进行操作的成员函数的程序代码均是一样的。4.2.1对象的定义格式类名对象名表;在建立对象时
6、,只为对象分配用于保存数据成员的内存空间,而成员函数的代码为该类的每一个对象所共享。定义一个对象和定义一个一般变量相同。定义变量时要分配存储空间,同样,定义一个对象时要分配存储空间,一个对象所占的内存空间是类的数据成员所占的空间总和。类的成员函数存放在代码区,不占内存空间。类中的成员函数可以调用类外定义的普通函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 14 页 -10 4.2.2对象的使用一个对象的成员就是该对象的类所定义的成员,有数据成员和成员函数,引用时同结构体变量类似,用“.”运算符。用成员选择运算符“.”只能访问对象的公有成员,而不能访问对象的私有成员或保护成员
7、。若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。调用成员形式:对象名.成员;4.2.3 对象的存储空间C+只为每一个对象的数据成员分配内存空间,类中的所有成员函数只生成一个副本,而该类的每个对象执行相同的函数成员副本。类的所有成员函数均放在公用区中(只保存一份),每个函数代码有一个地址,类的每个对象中只存放自己的数据成员值和指向公共区中对应函数的地址,即类的成员函数是共享的。4.2.4例题1.设计一个日期类 Date,包括年、月、日等私有数据成员,要求实现对日期的设置及输出显示。(显示格式为“月-日-年”)#include using namespace std;class
8、Date public: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;如果类中没有任何数据成员,size为1,确保不同对象有不同的地址。数据存储对齐方式则以两两之间的最大字节对齐,比如char 与 int以 4 字节对齐,占用了一个 8 字节空间。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 14 页 -11 void Date:showDate()coutmon
9、th-day-yearendl;int main()Date D;int year,month,day;coutyearmonthday;D.setDate(year,month,day);D.showDate();return 0;2.设计一个学生类 Student,包括学生的学号,姓名,年龄,家庭住址信息,要求设置并输出这些学生的信息。#include#include using namespace std;class Student public:void setStudent(int n,char na,int a,char addr);void showStudent();priva
10、te: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()名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 14 页 -12 coutno name age addressendl;int main()Student std;std.setStudent(1,Mary,20,吉林省长春市);std.
11、showStudent();return 0;4.3 构造函数和析构函数4.3.1 构造函数定义在定义一个对象的时候进行的数据成员设置,称为对象的初始化。构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数在对象被创建的时候将被自动调用。如果程序中未声明,则系统自动产生出一个隐含的参数列表为空的构造函数。定义构造函数的一般形式为:class 类名 public:类名(形参表);/构造函数的原型/类的其它成员;类名:类名(形参表)/构造函数的实现/函数体 类的构造函数承担对象的初始化工作,它旨在使对象初值有意义。对构造函数,说明以下几点:1.构造函数的函数
12、名必须与类名相同。构造函数的主要作用是完成初始化对象的数据成员以及其它的初始化工作。2.在定义构造函数时,不能指定函数返回值的类型,也不能指定为void类型。3.在类的内部定义的构造函数是内联函数。构造函数可以带默认形参值,也可以重载。一个类可以定义若干个构造函数。当定义多个构造函数时,名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 14 页 -13 必须满足函数重载的原则。类对象创建时,构造函数会自动执行;由于它们没有类型,不能像其他函数那样进行调用。当类对象说明时调用哪一个构造函数取决于传递给它的参数类型。4.若定义的类要说明该类的对象时,构造函数必须是公有的成员函数。如果定
13、义的类仅用于派生其它类时,则可将构造函数定义为保护的成员函数。由于构造函数属于类的成员函数,它对私有数据成员、保护的数据成员和公有的数据成员均能进行初始化。4.3.2 调用构造函数当定义类对象时,构造函数会自动执行。1.调用默认构造函数调用默认构造函数的语法:类名类对象名;在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该对象。默认构造函数并不对所产生对象的数据成员赋初值;即新产生对象的数据成员的值是不确定的。关于默认构造函数,说明以下几点:1、在定义类时,只要显式定义了一个类的构造函数,则编译器就不产生默认构造函数。2、所有的对象在定义时必须调用构造函数,不存在没有构造
14、函数的对象!3、在类中,若定义了没有参数的构造函数,或各参数均有缺省值的构造函数也称为默认构造函数,默认构造函数只能有一个。4、产生对象时,系统必定要调用构造函数。所以任一对象的构造函数必须唯一。2.调用带参数的构造函数调用带参数的构造函数的语法如下:类名 类对象名(参数表)参数表中的参数可以是变量,也可以是表达式。3.一次性对象创建对象如果不给出对象名,也就是说,直接以类名调用构造函数,可以多个构造函数带默认参数,但程序 中 不 能 使 用MyClass obj;这样定义对象,即不能够调用默认构造函数。如果定义了一个对象并且希望默认构造函数被执行,在定义语句中,“类对象名”后面是不需要空括号
15、的。如果包含了空括号,编译器将会产生一个语法错误信息。例如“MyClass2 mysa();”语句是非法的。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 14 页 -14 则产生一个无名对象。无名对象经常在参数传递时用到。例如:cout Date(2003,12,23);Date(2003,12,23)是一个对象,该对象在做了操作后便烟消云散了,所以这种对象一般用在创建后不需要反复使用的场合。4.用构造函数初始化对象的过程用构造函数初始化对象的过程,实际上是对构造函数的调用过程。一般按如下步骤进行:(1)程序执行到定义对象语句时,系统为对象分配内存空间。(2)系统自动调用构造函
16、数,将实参传送给形参,执行构造函数体时,将形参值赋给对象的数据成员。完成数据成员的初始化工作。4.3.3 复制构造函数用于将一个已知对象的数据成员复制给正在创建的另一个同类的对象。格式如下:类名:复制构造函数(类名&引用名)或类名:复制构造函数(const 类名&引用名)如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。但是,当类中的数据成员中使用new 运算符,动态地申请存储空间进行赋初值时,必须在类中显式地定义一个完成拷贝功能的构造函数,以便正确实现数据成员的
17、复制。拷贝构造函数就是函数的形参是类的对象的引用的构造函数。如果程序在类定义时没有显式定义拷贝构造函数,系统也会自动生成一个默认的拷贝构造函数,把成员值一一复制。拷贝构造函数与原来的构造函数实现了函数的重载。在以下 3 中情况下,复制构造函数都会被调用:?当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。?若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 14 页 -15?当函数的返回值是类对象时,系统自动调用拷贝构造函数。4.3.4析构函数C+程序设计的一个原则是:由系统自动
18、分配的内存空间由系统自动释放。而手工分配的内存空间必须手工是否,否则可能造成内存泄漏。人为的动态内存释放工作由析构函数来完成,它的意义是做关于对象本体失效之前瞬间的善后工作。这与构造函数的工作正好相反,当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间,所以给它取的名字也是波浪“”号加上类名,以示与构造函数在功能上的对应关系。析构函数与构造函数是成对出现的。析构函数是在对象生存期即将结束的时刻由系统自动调用的。显式定义析构函数格式为:类名:析构函数名()语句;若在类的定义中没有显式地定义析构函数时,系统将自动生成和调用一个默认析构函数,其格式为:类名:默认析构函数名()任何对象都必须
19、有构造函数和析构函数,但在撤消对象时,要释放对象的数据成员用new 运算符分配的动态空间时,必须显式地定义析构函数。析构函数的特点如下:1、析构函数是成员函数,函数体可写在类体内,也可写在类体外。2、析构函数是一个特殊的成员函数,函数名必须与类名相同,并在其前面加上字符“”,以便和构造函数名相区别。3、析构函数也是类的一个公有成员函数,不能带有任何参数,不能有返回值,不指定函数类型。4、一个类中,只能定义一个析构函数,析构函数不允许重载。5、析构函数是在撤消对象时由系统自动调用的。在程序的执行过程中,当遇到某一对象的生存期结束时,系统自动调用析构函数,然后再收回为对象分配的存储空间。对象在定义
20、时自动调用构造函数,生存期即将结束时调用析构函数!与析构函数名中间没有空格默认析构函数是一个空函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 14 页 -16 4.4 类的组合4.4.1类的组合类中的成员数据是另一个类的对象。可以在已有抽象的基础上实现更复杂的抽象。原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。声明形式:类名:类名(对象成员所需的形参,本类成员形参):对象 1(参数),对象 2(参数),.本类初始化 类组合的构造函数调用构造函数调用顺序:先调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造)。然后调用本类的构造函数。(析构函
21、数的调用顺序相反)初始化列表中未出现的内嵌对象,用默认构造函数(即无形参的)初始化系统自动生成的隐含的默认构造函数中,内嵌对象全部用默认构造函数初始化4.4.2 前向引用声明类应该先声明,后使用如果需要在某个类的声明之前,引用该类,则应进行前向引用声明。前向引用声明只为程序引入一个标识符,但具体声明在其他地方。使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象。应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。名师资料总结-精品资料
22、欢迎下载-名师精心整理-第 10 页,共 14 页 -17 4.5 UML 简介UML 语言是一种可视化的的面向对象建模语言。UML 有三个基本的部分事物(Things)UML 中重要的组成部分,在模型中属于最静态的部分,代表概念上的或物理上的元素关系(Relationships)关系把事物紧密联系在一起图(Diagrams)图是很多有相互相关的事物的组UML 中有 4 种类型的事物结构事物(Structural things)动作事物(Behavioral things)分组事物(Grouping things)注释事物(Annotational things)UML 中的关系依赖(Depe
23、ndencies)关联(Association)泛化(Generalization)实现(Realization)UML 中的 9 种图类图(Class diagram)对象图(Object diagram)用例图(Use case diagram)顺序图(Sequence diagram)协作图(Collaboration diagram)状态图(Statechart diagram)活动图(Activity diagram)组件图(Component diagram)实施图(Deployment diagram)名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 14 页 -1
24、8 4.5.1类图举例:Clock 类的完整表示Clock 类的简洁表示UML 规定数据成员表示的语法为:访问控制属性 名称 重数:类型=默认值 约束特征 这里必须至少指定数据成员的名称,其他都是可选的。访问控制属性:public,private,protected分别对应于+,-,#名称:表示数据成员的字符串重数:可以在名称后面的方括号内添加属性的重数类型:表示给数据成员的种类,可以是基本数据类型,也可以为用户自定义类型,还可以是某一个类。默认值:赋予该数据成员的初始值。约束特征:用户对该数据成员性质约束的说明,如只读 4.5.2对象图名师资料总结-精品资料欢迎下载-名师精心整理-第 12
25、页,共 14 页 -19 4.5.3类与对象关系的图形标识依赖关系图中的“类 A”是源,“类 B”是目标,表示“类 A”使用了“类 B”,或称“类 A”依赖“类 B”作用关系关联图中的“重数 A”决定了类 B 的每个对象与类 A的多少个对象发生作用,同样“重数 B”决定了类 A的每个对象与类 B的多少个对象发生作用。包含关系聚集和组合聚集表示类之间的关系是整体与部分的关系,“包含”、“组成”、“分为部分”等都是聚集关系。继承关系泛化名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 14 页 -20 4.5.4 注释在 UML 图形上,注释表示为带有褶角的矩形,然后用虚线连接到UML的其他元素上,它是一种用于在图中附加文字注释的机制。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 14 页 -