C++面向对象程序设计 第二章 类与对象.ppt
高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社主讲教师:个人主页:http:;/ 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社教材:教材:C+面向对象程序设计面向对象程序设计李涛李涛 主编主编游洪跃游洪跃 陈良银陈良银 李琳等编李琳等编高等教育出版社高等教育出版社20062006年年2 2月出版月出版2022/12/222主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社本书本书内容内容 2022/12/223主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社提纲输入与输出流输入与输出流第二章第二章 类与对象类与对象ARM Vector TableFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x001 13 32 2类与对象类与对象类的定义类的定义2022/12/224主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类的诞生(一)类的诞生(一)类(类(Class)是面向对象思想中的一个重要组成)是面向对象思想中的一个重要组成部分。部分。如何在计算机中将如何在计算机中将“类类”表达出来?表达出来?在在C语言中,当定义结构体(语言中,当定义结构体(struct):):struct SAMPLE int member1,member2;var1;以后,就可以使用结构中的成员:以后,就可以使用结构中的成员:int var=var1.member1*var1.member2;2022/12/225主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类的诞生(二)类的诞生(二)将结构体成员的使用代码写成一个函数,得到:将结构体成员的使用代码写成一个函数,得到:int caluc(struct SAMPLE var)return var.member1*var.member2;操作结构变量操作结构变量2022/12/226主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社然后,将上面的函数放入结构体中然后,将上面的函数放入结构体中struct SAMPLE int calcu()return member1*member2;int member1,member2;数据成员数据成员函数成员函数成员2022/12/227主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类的诞生(三)类的诞生(三)这样的结构体就具有了一定的这样的结构体就具有了一定的属性属性(member1和和member2),也具有一定的),也具有一定的行为行为(函数(函数calcu),),它就是它就是“类类”的雏形。的雏形。该结构体的使用方法如下:该结构体的使用方法如下:struct SAMPLE var;var.member1=var.member2=10;int temp=var.calcu();2022/12/228主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社2022/12/229主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的声明与定义(一)类的声明与定义(一)class CCompanyStaff /BEGIN /声明成员函数声明成员函数 void SetBasicSal(float sal);/设置基本工资设置基本工资 /声明(定义)数据成员声明(定义)数据成员 int m_iStaffNum;/工作编号工作编号 char m_cName20;/姓名姓名 float m_fRateOfAttend;/出勤率出勤率 float m_fBasicSal;/基本工资基本工资;/END 多了一个函数(多了一个函数(SetBasicSal),其它都象结构体。),其它都象结构体。struct class2022/12/2210主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社CCompanyStaff类的定义以关键字类的定义以关键字class开始。开始。其后是其后是类名。类名。“”表示类定义的开始和结束,表示类定义的开始和结束,最终以分号最终以分号结束结束。一般在类中只声明成员函数的原型,而函数的一般在类中只声明成员函数的原型,而函数的实现(即函数体的定义)则放在类外完成。实现(即函数体的定义)则放在类外完成。“函数原型函数原型”,即只声明函数名、参数类型和,即只声明函数名、参数类型和返回值类型,而不包括函数体代码。返回值类型,而不包括函数体代码。2022/12/2211主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的声明与定义(二)类的声明与定义(二)函数的定义则可在函数(函数的定义则可在函数(SetBasicSal)声明之)声明之后:后:void CCompanyStaff:SetBasicSal(float sal)m_fBasicSal=sal;函数定义:函数名前多了一个函数定义:函数名前多了一个类作用域运算符类作用域运算符(CCompanyStaff:),用于标识该函数定义),用于标识该函数定义属于哪一个类。属于哪一个类。2022/12/2212主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的声明与定义(三)类的声明与定义(三)对于对于C+语言的编程习惯:语言的编程习惯:1、将类的声明存放于、将类的声明存放于“*.h”或或“*.hpp”的头文件的头文件中,每个类一个声明文件。中,每个类一个声明文件。2、将类的定义存放于、将类的定义存放于“*.cpp”文件中,与相应文件中,与相应的声明文件一一对应的声明文件一一对应.c .cpp2022/12/2213主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社封装成类的好处封装成类的好处可以实现可以实现数据隐藏数据隐藏。封装也确定了类成员的封装也确定了类成员的访问属性访问属性。2022/12/2214主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社对象的封装性对象的封装性C+语言引入面向对象思想,引入类(对象)语言引入面向对象思想,引入类(对象)的概念之后,必然会具有一些新的特性。的概念之后,必然会具有一些新的特性。面向对象思想中类(对象)的基本特性之一:面向对象思想中类(对象)的基本特性之一:封装性封装性。封装性:直观理解,类将属于它的数据(成员封装性:直观理解,类将属于它的数据(成员变量)和针对数据的操作(成员函数)包裹在变量)和针对数据的操作(成员函数)包裹在一起就是一种封装。一起就是一种封装。封装的目的:保护类(对象)的实现。封装的目的:保护类(对象)的实现。对封装属性进行细分:公有的;私有的;保护对封装属性进行细分:公有的;私有的;保护的。的。2022/12/2215主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+的封装(一)的封装(一)C+语言为了实现面向对象的封装,引入了三语言为了实现面向对象的封装,引入了三个新的个新的“修饰修饰”关键字:关键字:public(公有的):公开的,可见的。对象成(公有的):公开的,可见的。对象成员(变量与方法)可以在对象外使用。员(变量与方法)可以在对象外使用。private (私有的):不可见的。成员只能在(私有的):不可见的。成员只能在对象内部使用。对象内部使用。protected (保护的):受到保护的。成员也(保护的):受到保护的。成员也只能在内部使用。(以后再讨论)只能在内部使用。(以后再讨论)C+类的成员(变量和方法)具有了各自不同类的成员(变量和方法)具有了各自不同的属性。的属性。2022/12/2216主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+的封装(二)的封装(二)class CCompanyStaff public:void SetBasicSal(float sal);/设置基本工资设置基本工资 private:int m_iStaffNum;/工作编号工作编号 char m_cName20;/姓名姓名 float m_fRateOfAttend;/出勤率出勤率 float m_fBasicSal;/基本工资基本工资;/END 2022/12/2217主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+的封装(三)的封装(三)CCompanyStaff staff;staff.SetBasicSal(600);/合法的,因为合法的,因为SetBasicSal是一个是一个公开(公开(public)的方法。)的方法。staff.m_iStaffNum=100;/非法的,因为非法的,因为m_iStaffNum是是一个私有(一个私有(private)的变量)的变量。void CCompanyStaff:SetBasicSal(float sal)m_fBasicSal=sal;/SetBasicSal是对象的成员,所以它是对象的成员,所以它的定义中可以访问的定义中可以访问m_fBasicSal私有变量。私有变量。2022/12/2218主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+的封装(四)的封装(四)1、C+类定义中的类定义中的缺省属性为私有缺省属性为私有的的(private)。)。2、每个修饰符的作用范:从一个修饰符开始,、每个修饰符的作用范:从一个修饰符开始,直到另外一个修饰符时结束(或类结束了)。直到另外一个修饰符时结束(或类结束了)。3、C+类中的成员(变量和方法)都应该明类中的成员(变量和方法)都应该明确地指明它们各自的属性。确地指明它们各自的属性。2022/12/2219主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类成员的访问权限类成员的访问权限封装所实现的数据隐藏是封装所实现的数据隐藏是面向对象程序设计的面向对象程序设计的一个一个关键特性关键特性隐藏一个类的数据从而使其隐藏一个类的数据从而使其他类无法访问。他类无法访问。隐藏由封装实现,所以隐藏所实现的类成员的隐藏由封装实现,所以隐藏所实现的类成员的访问控制权限也和封装方法一一对应访问控制权限也和封装方法一一对应。对应于封装,类成员有对应于封装,类成员有3种访问权限:种访问权限:公有类型(公有类型(public)、)、私有类型(私有类型(private)保护类型(保护类型(protected)。)。数据隐藏数据隐藏2022/12/2220主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类类 私有私有 公有公有数据或函数数据或函数数据或函数数据或函数无法从类无法从类外访问外访问允许从类允许从类外访问外访问类内类 外2022/12/2221主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社公有类型的成员定义了类的接口,由关键字公有类型的成员定义了类的接口,由关键字public声明,在声明,在类外只能访问公有成员类外只能访问公有成员。私有类型的访问权限为私有的成员由关键字私有类型的访问权限为私有的成员由关键字private声明,它们只能被类本身的成员函数访声明,它们只能被类本身的成员函数访问,问,来自类外部的任何访问都是非法的来自类外部的任何访问都是非法的。保护类型的成员与私有成员类似,区别仅在于保护类型的成员与私有成员类似,区别仅在于继承过程中,继承过程中,保护类型的成员可以被所在类的保护类型的成员可以被所在类的派生类成员函数访问派生类成员函数访问;而这一点对于私有成员;而这一点对于私有成员来说是非法的。来说是非法的。2022/12/2222主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类的成员函数类的成员函数可以访问类的所有成员,没有任可以访问类的所有成员,没有任何限制;何限制;而而类对象类对象访问类的成员就要受到访问控制符的访问类的成员就要受到访问控制符的限制。限制。访问权限举例:访问权限举例:sclass2_1_demo.h smain2_1.cpp 类对象和类的类对象和类的成员函数对数成员函数对数据成员的访问据成员的访问权限不同。权限不同。2022/12/2223主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社外部接口是类外访问类中私有数据的外部接口是类外访问类中私有数据的桥梁。桥梁。声明时,类中不同访问权限的成员可以按声明时,类中不同访问权限的成员可以按任意任意顺序顺序出现。出现。但依然涉及到一个编程习惯问题:但依然涉及到一个编程习惯问题:“以数据为中心以数据为中心”“以行为为中心以行为为中心”国际公约。国际公约。2022/12/2224主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社建议把一个类的数据成员都声明为私有的访问建议把一个类的数据成员都声明为私有的访问权限。权限。这样做有两个好处:这样做有两个好处:一是一是信息隐藏信息隐藏,即实现封装,把类的内部实现,即实现封装,把类的内部实现和外部表现分开,让使用者无需了解类的实现和外部表现分开,让使用者无需了解类的实现细节;细节;二是二是数据保护数据保护,将类的重要信息保护起来,以,将类的重要信息保护起来,以免被其他程序不恰当地修改。免被其他程序不恰当地修改。2022/12/2225主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社成员函数的实现成员函数的实现 被隐藏的数据可以有成员函数来访问,对数据被隐藏的数据可以有成员函数来访问,对数据的操作也体现在成员函数中:的操作也体现在成员函数中:成员函数决定对象的操作行为。成员函数决定对象的操作行为。它是程序算法的实现部分。它是程序算法的实现部分。它也是对封装的数据进行操作的唯一途径。它也是对封装的数据进行操作的唯一途径。它有两种方式:它有两种方式:类外实现和类内实现类外实现和类内实现。数据对成员函数数据对成员函数无法隐藏。无法隐藏。2022/12/2226主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社1一般实现方式一般实现方式类外实现成员函数的形式如下:类外实现成员函数的形式如下:返回值类型返回值类型 类名类名:成员函数名成员函数名(形式参数表)(形式参数表)函数体函数体例例2.2 企业员工类的实现。企业员工类的实现。sclass2_2_companyStaff.h s2_2sclass2_2_companyStaff.cpp s2_2smain2_2.cpp 2022/12/2227主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社2内联函数方式内联函数方式内联函数是指程序在编译时用函数的内联函数是指程序在编译时用函数的代码替换代码替换每一处函数调用的地方每一处函数调用的地方。内联的优点内联的优点以空间换时间以空间换时间。内联的内联的两种方式两种方式:系统默认:系统默认:sclass2_2_0_companyStaff.h 和函数前加关键字和函数前加关键字inline:inline ()smain2_3.cpp。2022/12/2228主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社内联和宏替换内联和宏替换宏替换是在宏替换是在编译前编译前由由预处理程序进行预处理预处理程序进行预处理,它只做简单的字符替换而不涉及语法检查。它只做简单的字符替换而不涉及语法检查。而内联函数是在而内联函数是在编译时编译时处理的,编译程序能识处理的,编译程序能识别内联函数,对它进行语法检查。别内联函数,对它进行语法检查。2022/12/2229主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类与对象类与对象 类(类(class):具有相同或相近的性质和行为的:具有相同或相近的性质和行为的事物集合。事物集合。对象(对象(object):the instance of a class。一个。一个类的实例,即类的性质(变量)具体化之后成类的实例,即类的性质(变量)具体化之后成为为 对象。对象。一个对象是类的一种特殊情况。一个对象是类的一种特殊情况。一个类会有很多的对象,一个类会有很多的对象,一个对象属于一个类。一个对象属于一个类。它们是一对多的关系。它们是一对多的关系。2022/12/2230主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+中的对象(一)中的对象(一)当当C+中类的成员变量被赋与特定的值之后,中类的成员变量被赋与特定的值之后,它即成为一个它即成为一个C+的对象。的对象。CCompanyStaff staff;/一个对象变量一个对象变量staff.m_iStafNum=12345;staff.m_cName=“张三张三”;staff成为类成为类CCompanyStaff的一个对象,它有的一个对象,它有了一个工作编号,对应一个人名。了一个工作编号,对应一个人名。当然,还会有很多其它的对象,比如当然,还会有很多其它的对象,比如staff1、staff2等等等等2022/12/2231主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+中的对象(二)中的对象(二)1、对象针对计算机而言,就是代码中的一个、对象针对计算机而言,就是代码中的一个变量。变量。2、C+中对象变量的使用与中对象变量的使用与C语言中结构体变语言中结构体变量的使用方法一样。量的使用方法一样。CCompanyStaff staff1,*pstaff1,staff310;staff1.m_iStafNum=11111;pstaff m_iStafNum=22222;staff0.m_iStafNum=33333;2022/12/2232主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的对象化(一)类的对象化(一)C+中对象是类的变量,但它不象变量那么单纯。中对象是类的变量,但它不象变量那么单纯。C+提供一套提供一套特殊的机制特殊的机制实现类到对象的转换。实现类到对象的转换。class CCompanyStaff public:CCompanyStaff();CCompanyStaff();void SetBasicSal(float sal);/设置基本工资设置基本工资 private:int m_iStaffNum;/工作编号工作编号;/END 2022/12/2233主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社对象的创建和销毁对象的创建和销毁 创建对象时,创建对象时,“对象存放在何处?对象存放在何处?”需要向操作系统需要向操作系统申请一定的内存空间申请一定的内存空间用于存放用于存放新建的对象。新建的对象。为对象分配存储空间主要有为对象分配存储空间主要有静态分配和动态分静态分配和动态分配两种方式。配两种方式。2022/12/2234主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社可以将对象或静态成员存放在栈中或静态存储可以将对象或静态成员存放在栈中或静态存储区域中。区域中。动态内存分配是指在堆(也称自由内存)中分动态内存分配是指在堆(也称自由内存)中分配存储单元,即为对象动态从堆中分配内存。配存储单元,即为对象动态从堆中分配内存。使用操作符使用操作符new分配内存空间;分配内存空间;使用操作符使用操作符delete释放内存空间。释放内存空间。2022/12/2235主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社构造函数与析构函数构造函数与析构函数C+语言为了保证一个对象被初始化(类的实语言为了保证一个对象被初始化(类的实例化),例化),定义了一组特殊的方法(函数),定义了一组特殊的方法(函数),专专门用于对象生成时的初始化。门用于对象生成时的初始化。构造函数(构造函数(constructor)与类名称相同,与类名称相同,没有返回值。它在对象生成之时没有返回值。它在对象生成之时自动执行自动执行。析构函数(析构函数(destructor)在类名前加在类名前加作为作为函数名的函数,没有返回值,也没有参数。它函数名的函数,没有返回值,也没有参数。它在对象结束时在对象结束时自动执行自动执行。2022/12/2236主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+要求类设置一个专门的成员函数来负责类要求类设置一个专门的成员函数来负责类中所有中所有对象的初始化对象的初始化,这个成员函数就是构造,这个成员函数就是构造函数。函数。构造函数的作用就是在对象被创建时利用特定构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化到一个特定的状的值构造对象,将对象初始化到一个特定的状态。态。声明一个构造函数的语示格式如下:声明一个构造函数的语示格式如下:public:类名(类名();2022/12/2237主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社构造函数可以由程序设计人员自己编写。构造函数可以由程序设计人员自己编写。也可以由系统提供。也可以由系统提供。例例2.4 构造函数举例。构造函数举例。sclass2_4_companyStaff.h smain2_4.cpp2022/12/2238主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社重载构造函数重载构造函数 所谓重载构造函数,是指同一个构造函数名,所谓重载构造函数,是指同一个构造函数名,具有不同的实现。具有不同的实现。例例2.5 在员工管理系统中,创建一个对象时,在员工管理系统中,创建一个对象时,还可以一次性地给对象的姓名、出勤率、基本还可以一次性地给对象的姓名、出勤率、基本工资等几个数据成员都赋初值,这就需要重载工资等几个数据成员都赋初值,这就需要重载构造函数。构造函数。sclass2_5_companyStaff.h sclass2_5_companyStaff.cpp smain2_5.cpp 2022/12/2239主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社需要注意一点,当构造函数带默认参数时,要需要注意一点,当构造函数带默认参数时,要谨防出现歧义。谨防出现歧义。例例2.6 下面这个程序存在歧义。下面这个程序存在歧义。sclass2_6.h smain2_6.cpp 当创建对象当创建对象d2时时,有二义性。,有二义性。2022/12/2240主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社拷贝构造函数拷贝构造函数 拷贝构造函数是用来拷贝构造函数是用来复制对象复制对象的一种特殊的构的一种特殊的构造函数。造函数。声明拷贝构造函数的声明拷贝构造函数的语法格式语法格式如下:如下:class 类名类名public:类名(类名(const类名类名&对象名对象名););只有一个参数只有一个参数2022/12/2241主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社例例2.7 通过水平坐标和垂直坐标来确定屏幕上通过水平坐标和垂直坐标来确定屏幕上的一个点。的一个点。sclass2_7_point.h smain2_7.cpp CPoint b(a);CPoint c=a;2022/12/2242主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社析构函数析构函数 析构函数与构造函数的作用几乎正好相反,当一个对析构函数与构造函数的作用几乎正好相反,当一个对象消失时,或用象消失时,或用delete删除用删除用new创建的对象时,系统创建的对象时,系统都会自动调用类的析构函数,做一些清理工作。都会自动调用类的析构函数,做一些清理工作。声明一个析构函数的声明一个析构函数的语法格式语法格式如下:如下:class Demopublic:Demo();Demo(void);2022/12/2243主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社析构函数析构函数不能重载不能重载。/析构函数析构函数CCompanyStaff(void)cout 对象对象 m_cName 消亡消亡 endl;2022/12/2244主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社当某对象消亡时,系统会自动调用该对象的析当某对象消亡时,系统会自动调用该对象的析构函数。构函数。而且而且调用的顺序调用的顺序是:最后创建的对象最先消亡,是:最后创建的对象最先消亡,即最先调用其析构函数;即最先调用其析构函数;相反地,最先创建的对象最后消亡,即最后调相反地,最先创建的对象最后消亡,即最后调用其析构函数。用其析构函数。如果不显式地定义析构函数,系统也会生成一如果不显式地定义析构函数,系统也会生成一个默认的析构函数,它是一个空的析构函数,个默认的析构函数,它是一个空的析构函数,不做任何事情。不做任何事情。2022/12/2245主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的对象化(二)类的对象化(二)class CCompanyStaff public:CCompanyStaff();CCompanyStaff(int num,char*pName);CCompanyStaff();void SetBasicSal(float sal);/设置基本工资设置基本工资;/END CCompanyStaff staff(12345,“张三张三”);2022/12/2246主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社C+类的对象化(三)类的对象化(三)1、构造函数与析构函数被、构造函数与析构函数被“隐含隐含”调用,即调用,即不管愿意与否,它们都会被不管愿意与否,它们都会被“强制强制”地执行。地执行。2、C+类都有缺省的构造函数,即没有参数类都有缺省的构造函数,即没有参数的构造函数。它也是的构造函数。它也是“强制强制”的,没有定义每的,没有定义每个类也有一个这样的构造函数。个类也有一个这样的构造函数。3、编程习惯:不管有用没用,希望编程人员、编程习惯:不管有用没用,希望编程人员为每个类定义明确的构造与析构函数为每个类定义明确的构造与析构函数2022/12/2247主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社对象成员的访问对象成员的访问 可以通过对象名,也可以通过对象地址来访问可以通过对象名,也可以通过对象地址来访问一个对象一个对象:;./访问公有数据成员访问公有数据成员.()/访问公有成员函数访问公有成员函数 CCompanyStaff staff1(LiHua);staff1.SetBasicSal(4000.0);2022/12/2248主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社 *;-/访问公有数据成员访问公有数据成员-()/访问公有成员函数访问公有成员函数CCompanyStaff *pstaff;pstaff=new CCompanyStaff(LiuMei,0.95,3000.0);pstaff-GetName()2022/12/2249主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社例例2.8 在员工管理系统中,建立两个对象分别在员工管理系统中,建立两个对象分别用两种方式去访问类成员。用两种方式去访问类成员。sclass2_8_companyStaff.h sclass2_8_companyStaff.cpp smain2_8.cpp 2022/12/2250主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社普通对象指针普通对象指针 例例2.9 普通对象指针举例。普通对象指针举例。sclass2_9_objPointer.h smain2_9.cpp CPointerExam*pointer;pointer=&obj;pointer-SetNum(2);对象指针在使用之前一定要初始化,为其动态对象指针在使用之前一定要初始化,为其动态分配存储空间;分配存储空间;使用完毕必须释放该对象指针所使用完毕必须释放该对象指针所代表的代表的资源。资源。2022/12/2251主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社对象的对象的this指针指针 每个每个对象都拥有自己独立的对象都拥有自己独立的数据成员。数据成员。而类中的所有对象使用而类中的所有对象使用相同的成员函数相同的成员函数,成员,成员函数在内存中函数在内存中只有一份只有一份。每个对象隐含每个对象隐含了一个常量指针,称为了一个常量指针,称为this指针,指针,用于指向当前发送消息的对象,以识别当前调用于指向当前发送消息的对象,以识别当前调用成员函数的对象究竟是谁用成员函数的对象究竟是谁。当通过一个对象调用成员函数时,系统当通过一个对象调用成员函数时,系统先将该先将该对象的地址赋给对象的地址赋给this指针,指针,成员函数在对对象成员函数在对对象的数据进行操作时,就隐含地使用了的数据进行操作时,就隐含地使用了this指针。指针。2022/12/2252主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社CCompanyStaff(char cName)strcpy(m_cName,cName);CCompanyStaff(char cName,CCompanyStaff*const this)strcpy(this-m_cName,cName);显示指明显示指明this2022/12/2253主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社CCompanyStaff(char cName)strcpy(this-m_cName,cName);隐含隐含this2022/12/2254主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社一般不需要显示指出一般不需要显示指出this,只有当函数需要,只有当函数需要返返回当前对象回当前对象自身的时候,才显式地使用它。自身的时候,才显式地使用它。例例2.10 this指针举例。指针举例。sclass2_10_this.h smain2_10.cpp CSample Add(CSample s1,Csample s2)this-n=s1.n+s2.n;return(*this);2022/12/2255主讲教师:四川大学计算机学院主讲教师:四川大学计算机学院 高级语言程序设计II 四川大学精品课程 C+面向对象程序设计 主编:李涛 高教出版社类成员指针类成员指针 如果指针如果指针指向类数据成员的地址指向类数据成员的地址,则这个指针,则这个指针称为类数据成员指针;称为类数据成员指针;:*sclass2_11_dataPointer.h smain2_11.cpp int CSample:*p=&CSample:m;CSample s1;s1.*p=20;类数据成员指针只能指向类数据成员指针只能指向公有数据公有数据成员。成员。2022/12/2256主讲