版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 类和对象,目的与要求 9.1 概述 9.2 类与对象 9.3 构造函数 9.4 析构函数 9.5 构造函数和对象成员 9.6 this指针 本章小结,目的与要求,通过本章学习,应理解类与对象的概念,掌握类与对象的定义方法,能用类描述某事物,用类定义的对象对该事物进行处理。了解构造函数与析构函数的概念及作用,掌握构造函数与析构函数的定义格式及使用方法。初步掌握new运算符动态建立对象及用delete运算符回收对象占用空间的方法。初步掌握类中对象成员的构造函数格式及调用过程。理解this指针的概念。,9.1 概述,引例: 【例9.1】先定义一个学生成绩的结构体类型student,再定义计算
2、学生平均成绩的函数Average()与显示学生成绩的函数Display(),在主函数中输入学生成绩,并调用Average()计算平均成绩,调用Display()显示学生成绩。,例程,概述,1用结构体描述与处理事物存在的问题 (1)程序的独立性与可维护性差 (2)数据的安全性差 2解决问题的方法 采用面向对象的程序设计方法(简称OOP) 面向对象的程序设计方法是将描述某类事物的数据与处理这些数据的函数封装成一个整体,称为类 。,9.2 类与对象,9.2.1 类 1.类的定义 (1)类是由描述某类事物的数据和处理数据的函数组成的导出数据类型。 (2)类的成员有两种:数据成员、成员函数。,2.定义格
3、式,类的定义格式为: class private: /定义私有数据成员或成员函数 public: /定义公有数据成员或成员函数 protected: /定义保护数据成员或成员函数 ;,3.成员访问权限,private:定义私有成员。 私有数据成员只允许类内函数访问,私有成员函数只允许在类内调用。类外函数不允许访问私有数据成员,也不允许调用私有成员函数。,成员访问权限,public:定义公有成员。 公有数据成员允许类内或类外的函数 访问,公有成员函数允许在类内或类外调 用。,成员访问权限,protected:定义保护成员。 保护数据成员只允许类内或其子类中函 数访问,保护成员函数允许在类内或其子
4、 类中调用。,类的定义举例,【例9.2】定义学生成绩类Student,其数据成员与成员函数如下。 (1)描述学生成绩的私有数据成员为:姓名 ( Name8 )、物理(Phi)、数学(Math)、平均成绩(Ave); (2)处理学生成绩的公有成员函数为: 输入学生成绩成员函数:Input(); 计算平均成绩成员函数:Average(); 显示学生成绩成员函数:Display(); 输出学生成绩成员函数:Output()。 例程,4.类的特点,(1)类具有封装性 (2)类具有安全性 (3)类具有独立性与可维护性。 (4)类具有继承性 (5)类具有重载性与多态性,5.类的说明,(1)类的成员默认的访
5、问权限为私有。 (2)成员函数可在类体内作引用性说明,类体外作定义性说明。 在类体外定义成员函数的格式为: :(形参表) 函数体 (3)关键词public、private、protected在类中使用先后次序无关紧要,且可使用多次。,类的说明,(4)数据成员与成员函数在类中的定义次序无关紧要 。 (5)因为类是一种数据类型,系统并不会为其分配内存空间 ,所以在定义类中的数据成员时,不能对其进行初始化,也不能指定其存储类型。 (6)类和结构体的关系 结构体与类唯一区别在于:在类中,其成员的缺省存取权限是私有,而在结构体类型中,其成员的缺省权限是公有。,9.2.2 对象,用类定义的变量称为对象。
6、1.对象的定义格式 存储类型 ,; 例如: Student stu1,stu2; 2.存储空间的分配 定义类时系统并不为类分配内存空间,仅当用类定义对象时系统才为对象分配内存空间。 为对象分配的存储空间大小取决于在定义类时所定义的成员类型和数量。 在创建对象时,类被用作样板,因此对象也称为实例。 在建立不同对象时,系统只为数据成员分配不同内存空间,而不同对象的成员函数则共享同一内存空间。,3.定义对象的三种方式,(1)先定义类,后定义对象,例如: Student stu1,stu2; (2)定义类的同时定义对象,例如: class Student stu1,stu2; (3)直接定义对象,例如
7、: class stu1,stu2;,4.对象成员的引用,每个由类定义的对象都有若干个数据成员与成员函数,在类外通过对象可以使用公有的数据成员及成员函数。 (1)引用数据成员的格式为: (2)调用成员函数的格式为: (实参) 注意:在类内引用本类的数据成员或调用本类的成员函数时,不能加对象名。,5.对象的赋值运算,同类对象之间所能进行的惟一运算就是赋值运算,赋值运算的格式为: =; 【例9.4】定义描述学生成绩的类Student,然后用Student定义一个学生对象stu。在主函数中输入学生的姓名、物理、数学,并调用成员函数Input()输入到数据成员Name、Phi、Math中,调用成员函数
8、Average()计算平均成绩,调用成员函数Output()将对象stu的私有数据成员返回给主函数,并显示其值。最后再调用成员函数Display()显示私有数据成员的值。 例程,对象的使用说明,(1)定义对象时,编译系统为不同对象的数据成员分配不同的内存空间; (2)不能在类外直接对其私有数据成员进行操作,如:stu.Phi=90;是错误的。而只能通过公有成员函数Input()对其进行赋值操作,这样就保证了数据的安全性。 (3)对象允许进行赋值运算。同类对象的赋值运算将stu1的所有数据成员值赋给stu2对应的数据成员。 (4)对象作为函数参数时,属于值传送。只能通过函数返回对象值,而不能通过
9、形参返回运算结果。 (5)在定义对象时可对公有数据成员进行初始化赋值,但不能对私有或保护数据成员进行初始化赋值。私有或保护数据成员只能通过构造函数进行初始化赋值。,9.3 构造函数,构造函数主要作用是在定义对象时,对其数据成员进行初始化。 9.3.1 构造函数的定义 1.构造函数的定义格式 : () 构造函数体 注意:构造函数的函数名必须与类名相同,且无返回数据类型。若在类内定义构造函数,则“:”可省去。 【例9.5】在【例9.4 】的学生成绩类Student中定义构造函数,用构造函数实现对象stu1的初始化赋值。 例程,2.对构造函数的说明,(1)构造函数名必须与类同名。 (2)定义构造函数
10、时,不能定义函数返回值的类型,也不能指定为void 类型。因构造函数无需返回函数值 。 (3)构造函数可重载,其参数可有可无,也可指定默认值。 (4)若要用类定义对象,则构造函数必须是公有成员函数。若类仅用于派生其它类,则构造函数可定义为保护成员函数。,9.3.2 用构造函数初始化对象的过程,用构造函数初始化对象的过程,实际上就是对构造函数的调用过程。其步骤为: (1)程序执行到定义对象语句时,系统为对象分配内存空间; (2)系统自动调用构造函数,将实参传送给形参,执行构造函数体时,将形参值赋给对象的数据成员。 【例9.6】定义描述矩形的类。用构造函数完成矩形对象的初始化,编写计算矩形面积的函
11、数,并输出矩形面积。 例程,用构造函数初始化对象时的注意点,(1)定义无参对象时,对象后不能跟“()”。 (2)类已定义构造函数前提下,有参(无参)对象必须定义带参(无参)构造函数,9.3.3 默认构造函数,默认构造函数有三类: (1)编译器产生的缺省构造函数(前提:用户未定义构造函数) 格式: :( ) ;/该构造函数什么也不做。 (2)无参构造函数 (3)各参数均有默认值的构造函数 默认构造函数必须惟一。,9.3.4 拷贝的构造函数,用类定义对象时,可用拷贝功能的构造函数将另一个已存在对象的数据拷贝到新建的对象中。 拷贝构造函数的格式为: :(类名 ,9.5 构造函数和对象成员,在一个类的
12、定义中,若定义有n个对象成员,则其构造函数的一般格式为: :(形参表):(实参表1),(实参表n) 构造函数体 其中:(实参1),(实参n) 称为成员初始化表。 【例9.12】定义一个描述矩形的类与一个描述长方体的类,用矩形类的对象作为长方体类的成员,讨论长方体类中的构造函数与对象成员的初始化过程。例程,对构造函数的几点说明,(1)形参必须带有类型说明,而实参是可计算值的表达式。 (2)对象成员构造函数的调用顺序取决于这些对象成员在 类中的说明顺序,而与它们在成员初始化表的位置无关。 (3)建立类的对象时,先调用各个对象成员的构造函数,初始化相应的对象成员,然后才执行类的构造函数,初始化类中其
13、它成员。析构函数的调用顺序与构造函数正好相反。 【例9.13】说明构造函数与析构函数的调用顺序。 例程,9.6 this指针,用类定义一个对象时,系统会自动建立一个指向该对象的指针变量,该指针变量称this指针,this指针变量指向所定义的对象。 this 指针具有如下形式的默认说明: * const this=,本章小结,1类的定义 类:类由描述某类事物的数据(数据成员)及处理数据的函数(成员函数)组成。类的定义格式为: class public: /定义公有数据成员或成员函数, private: /定义私有数据成员或成员函数 protected: /定义保护数据成员或成员函数 ,成员的访问
14、属性,2.对象,对象:用类定义的变量称为对象。对象的定义格式: , , ; 对象的成员分为数据成员与成员函数两类。 在类外: 数据成员引用方式为:.; 成员函数的调用方式为:.(实参); 在类内引用或调用时,不写对象名。,3.构造函数与析构函数,(1)构造函数用于对象数据成员的初始化。构造函数名必须与类名相同,且无返回类型。 构造函数允许重载,将无参或有默认值参数的构造函数称为默认的构造函数。当用户没有定义构造函数时,系统会自动产生一个默认的构造函数,该构造函数体为空。 常用的构造函数有三类:有参构造函数、无参构造函数与拷贝构造函数。拷贝构造函数的形参必须为类的对象。,构造函数与析构函数,(2
15、)析造函数名由类名前加“”组成,且无参数及返回类型。其作用是撤消对象,并回收对象占用的内存空间。 (3)构造与析构函数的调用 用类说明一个对象时,系统先为其分配内存空间,再调用构造函数对数据成员进行初始化。当对象结束其生命期,系统调用析构函数,回收对象所占用的内存空间。,构造函数与析构函数,(4)构造函数与对象成员 在建立新类时,允许用已存在的类定义对象成员,类的构造函数格式为: :(形参):(实参表1) ,(实参表2),(实参表n) 函数体 构造函数的调用顺序是,先调用各对象成员的构造函数,再调用类本身的构造函数。 析构函数的调用顺序与构造函数正好相反。,4.new与delete 运算符,n
16、ew 运算符用于动态建立对象,用new动态 建立对象时,系统先为对象分配内存空间,后调 用构造函数对对象初始化。用new运算符动态建 立的对象,必须用delete运算符撤消。 delete运算符用于撤消动态建立的对象,用 delete 运算符撤消动态建立的对象时,系统先调 用析构函数,并由析构函数回收对象占用的内存 空间。,5.this指针,用类定义一个对象时,由系统自动建立指向该对象的指针称为this指针。 this 指针的默认定义格式: * const this=,例9.1(1),#include struct Student char Name8; /学生姓名 float Phi,Mat
17、h,Ave; /物理、数学、平均成绩 ; void Average(Student ,例9.1(2),void main(void) Student stu; cinstu.Namestu.Phistu.Math; /输入姓名与成绩 Average(stu); /计算平均成绩 Display(stu); /显示输出学生成绩 ,返回,例9.2(1),#include # include class Student private: char Name8; /定义姓名、物理、数学、平均成绩 float Phi,Math,Ave; /为私有数据成员 public: void Input(char n
18、ame,float phi,float math) /定义Input() strcpy(Name,name); Phi=phi; Math=math; ,例9.2(2),void Average(void) /定义Average() Ave=(Phi+Math)/2; void Display( void) /定义Display() coutNametPhitMathtAven; void Output(char name,float 返回,例9.4(1),#include # include class Student private: char Name8; float Phi,Math,
19、Ave; public: void Input(char name,float phi,float math); void Average(void) Ave=(Phi+Math)/2; void Display( void) coutNametPhitMathtAven; void Output(char name,float ,例9.4(2),void Student:Input(char name,float phi,float math) strcpy(Name,name); Phi=phi; Math=math; void Student:Output(char name,float
20、 ,例9.4(3),void main(void) Student stu1,stu2; char name8; float phi,math,ave; coutnamephimath; stu1.Input(name,phi,math); stu1.Average(); stu1.Output(name,phi,math,ave); coutnametphitmathtaveendl; stu2=stu1; stu2.Display(); ,例9.4(4),程序执行后提示与输出如下: 请输入学生姓名、物理与数学成绩: Zhou 90 80 Zhou 90 80 85 Zhou 90 80 8
21、5 返回,例9.5(1),#include # include class Student private: char Name8; float Phi,Math,Ave; public: Student(char name,float phi,float math); void Display( void) coutNametPhitMathtAven; void Average(void) Ave=(Phi+Math)/2; ;,例9.5(2),Student:Student(char name,float phi,float math) strcpy(Name,name); Phi=ph
22、i; Math=math; void main(void) Student stu1(Zhou,90,80); stu1.Average(); stu1.Display() ; 程序执行后输出: Zhou 90 80 85 返回,例9.6(1),# include # include class Rectangle private: int Left, Top, Right,Bottom; public: Rectangle(int L, int T, int R,int B) cout 调用带参构造函数endl; Left=L; Top=T; Right=R;Bottom=B; Rectan
23、gle( ) cout 调用无参构造函数endl; Left=0; Top=0; Right=0;Bottom=0; int Area(void) return abs( (Right-Left)*(Bottom-Top); ;,例9.6(2),void main (void) Rectangle r1(100, 50, 200,100); cout矩形r1的面积=r1.Area()endl; Rectangle r2; cout矩形r2的面积=r2.Area()endl; 程序执行后输出: 调用带参构造函数 矩形r1的面积=5000 调用无参构造函数 矩形r2的面积=0 返回,例9.7(1)
24、,# include # include class Rectangle private: int Left,Right,Top,Bottom; public: Rectangle(int L,int R,int T,int B) cout调用带参构造函数endl; Left=L;Right=R;Top=T;Bottom=B; ,例9.7(2),Rectangle( ) cout 调用无参构造函数endl; Left=0; Top=0; Right=0;Bottom=0; Rectangle(Rectangle ,例9.7(3),void main (void) Rectangle r1(10
25、0,200,50,100); cout矩形r1的面积=r1.Area()endl; Rectangle r2; cout矩形r2的面积=r2.Area()endl; Rectangle r3 (r1);/调用拷贝构造函数初始化r3 cout矩形r3 ,例9.7(4),程序执行后输出: 调用带参构造函数 矩形r1的面积=5000 调用无参构造函数 矩形r2的面积=0 调用拷贝构造函数 矩形r3的面积=5000 返回,例9.8(1),# include # include class Rectangle private: int Left, Top, Right,Bottom; public: R
26、ectangle(int L, int T, int R,int B) cout 调用带参构造函数endl; Left=L; Top=T; Right=R;Bottom=B; ,例9.8(2),Rectangle( ) cout 调用无参构造函数endl; Left=0; Top=0; Right=0;Bottom=0; int Area(void) return abs(Right-Left)*(Bottom-Top); ;,例9.8(3),void main (void) Rectangle *pr1= new Rectangle (100,50, 200,100); coutArea()
27、Area()endl; delete pr1; delete pr2; ,例9.8(4),程序执行后输出: 调用带参构造函数 矩形r1的面积=5000 调用无参构造函数 矩形r2的面积=0 返回,例9.9(1),# include # include class Rectangle private: int Left,Top, Right,Bottom; public: Rectangle(int L,int T, int R,int B) cout 调用带参构造函数Rectangle(int L,int T, int R,int B) endl; Left=L;Top=T; Right=R;
28、Bottom=B; ,例9.9(2),Rectangle(int R,int B ) cout 调用带参构造函数Rectangle(int R,int B ) endl; Left=0; Top=0;Right=R; Bottom=B; Rectangle( ) cout调用了析构函数!endl; int Area(void) return abs(Right-Left)*(Bottom-Top); ; void main (void) Rectangle r1(100,200,50,100); cout矩形r1的面积=r1.Area()endl;,例9.9(3),Rectangle r2 (
29、100,100); cout矩形r2的面积=r2.Area()endl; 执行程序后输出: 调用带参构造函数Rectangle(int L,int R,int T,int B) 矩形r1的面积=5000 调用带参构造函数Rectangle(int R,int B ) 矩形r2的面积=10000 调用了析构函数! 调用了析构函数! 返回,例9.10(1),# include class Complex private: float Real,Image; /定义复数实部与虚部为私有数据成员 public: Complex(float R=0,float I=0) /定义带参构造函数 cout调用
30、带参构造函数!endl; Real=R;Image=I; Complex(Complex ,例9.10(2),Complex() cout调用析构函数!endl; void Show(int i) coutci=Real+Imageiendl; ; void main(void) Complex c1(10,20); c1.Show(1); Complex c2(c1); c2.Show(2); Complex c3; c3.Show(3); ,例9.10(3),程序执行后输出: 调用带参构造函数! c1=10+20i 调用拷贝构造函数! c2=10+20i 调用带参构造函数! c3=0 +
31、0 i 调用析构函数! 调用析构函数! 调用析构函数! 返回,例9.11(1),# include class Complex public: float Real,Image; public: Complex(float R,float I) Real=R; Image=I; cout调用带参构造函数Complex(float ,float) endl; Complex() Real=0; Image=0; cout调用无参构造函数Complex( ) endl; ,例9.11(2),Complex() coutShow(1); Complex *pc2= new Complex; pc2-Show(2); delete pc1; /回收pc1所指对象占用的内存空间 delete pc2; /回收pc2所指对象占用的内存空间 ,例9.11(3),程序执行后输出: 调用带参构造函数Complex(float ,float) c1=10+20i 调用无参构造函数Complex() c2=0+0i 调用了析构函数! 调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 景区观光电梯租赁合同
- 船舶驾驶员聘用合同协议书
- 办公区绿化区道路施工合同
- 临时科研实验室租赁协议
- 旅游者投诉处理协议
- 沥青道路铺装工程合同案例
- 天然气开采土方施工合同
- 2024物业公司设施设备维护保养合同
- 二零二五年度旋挖钻机融资租赁合同3篇
- 二零二五年度汽车租赁与定制路线合同范本2篇
- 2024年广东石油化工学院公开招聘部分新机制合同工20名历年(高频重点提升专题训练)共500题附带答案详解
- 湖南省长沙市中学雅培粹学校2025届七年级数学第一学期期末调研模拟试题含解析
- 股权质押登记授权委托书
- 混凝土采购运输组织供应、运输、售后服务方案
- 2024糖尿病酮症酸中毒诊断和治疗课件
- 审计职业生涯规划书
- 2024-2029年中国脊柱侧弯支具行业市场现状分析及竞争格局与投资发展研究报告
- 新媒体部门岗位配置人员架构图
- 认识各种乐器
- 神农架自然保护区森林生态系统服务价值评估
- DJG330110-T 0101-2022 电动自行车充换电站建设及运营管理规范
评论
0/150
提交评论