类和对象-无锡职业技术学院.ppt_第1页
类和对象-无锡职业技术学院.ppt_第2页
类和对象-无锡职业技术学院.ppt_第3页
类和对象-无锡职业技术学院.ppt_第4页
类和对象-无锡职业技术学院.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章 类和对象 目的与要求 9.1 概述 9.2 类与对象 9.3 构造函数 9.4 析构函数 9.5 构造函数和对象成员 9.6 this指针 本章小结 目的与要求 通过本章学习,应理解类与对象的概念 ,掌握类与对象的定义方法,能用类描述 某事物,用类定义的对象对该事物进行处 理。了解构造函数与析构函数的概念及作 用,掌握构造函数与析构函数的定义格式 及使用方法。初步掌握new运算符动态建 立对象及用delete运算符回收对象占用空 间的方法。初步掌握类中对象成员的构造 函数格式及调用过程。理解this指针的概 念。 9.1 概述 引例: 【例9.1】先定义一个学生成绩的结构体 类型student,再定义计算学生平均成绩 的函数Average()与显示学生成绩的函数 Display(),在主函数中输入学生成绩, 并调用Average()计算平均成绩,调用 Display()显示学生成绩。 例程 概述 1用结构体描述与处理事物存在的问题 (1)程序的独立性与可维护性差 (2)数据的安全性差 2解决问题的方法 采用面向对象的程序设计方法(简称OOP) 面向对象的程序设计方法是将描述某类事 物的数据与处理这些数据的函数封装成一个整 体,称为类 。 9.2 类与对象 9.2.1 类 1.类的定义 (1)类是由描述某类事物的数据和处 理数据的函数组成的导出数据类型。 (2)类的成员有两种:数据成员、成 员函数。 2.定义格式 类的定义格式为: class private: /定义私有数据成员或成员函数 public: /定义公有数据成员或成员函数 protected: /定义保护数据成员或成员函数 ; 3.成员访问权限 private:定义私有成员。 私有数据成员只允许类内函数访问, 私有成员函数只允许在类内调用。类外 函数不允许访问私有数据成员,也不允 许调用私有成员函数。 成员访问权限 public:定义公有成员。 公有数据成员允许类内或类外的函数 访问,公有成员函数允许在类内或类外调 用。 成员访问权限 protected:定义保护成员。 保护数据成员只允许类内或其子类中函 数访问,保护成员函数允许在类内或其子 类中调用。 类的定义举例 【例9.2】定义学生成绩类Student,其数据成员与成员函数 如下。 (1)描述学生成绩的私有数据成员为:姓名 ( Name8 )、 物理(Phi)、数学(Math)、平均成绩(Ave); (2)处理学生成绩的公有成员函数为: 输入学生成绩成员函数:Input(); 计算平均成绩成员函数:Average(); 显示学生成绩成员函数:Display(); 输出学生成绩成员函数:Output()。 例程 4.类的特点 (1)类具有封装性 (2)类具有安全性 (3)类具有独立性与可维护性。 (4)类具有继承性 (5)类具有重载性与多态性 5.类的说明 (1)类的成员默认的访问权限为私有。 (2)成员函数可在类体内作引用性说明,类体外作定 义性说明。 在类体外定义成员函数的格式为: :(形参表) 函数体 (3)关键词public、private、protected在类中使用先后 次序无关紧要,且可使用多次。 类的说明 (4)数据成员与成员函数在类中的定义次序无关 紧要 。 (5)因为类是一种数据类型,系统并不会为其分 配内存空间 ,所以在定义类中的数据成员时,不 能对其进行初始化,也不能指定其存储类型。 (6)类和结构体的关系 结构体与类唯一区别在于:在类中,其成员的 缺省存取权限是私有,而在结构体类型中,其成 员的缺省权限是公有。 9.2.2 对象 用类定义的变量称为对象。 1.对象的定义格式 存储类型 ,; 例如: Student stu1,stu2; 2.存储空间的分配 定义类时系统并不为类分配内存空间,仅当用类定义对象 时系统才为对象分配内存空间。 为对象分配的存储空间大小取决于在定义类时所定义的成 员类型和数量。 在创建对象时,类被用作样板,因此对象也称为实例。 在建立不同对象时,系统只为数据成员分配不同内存空间 ,而不同对象的成员函数则共享同一内存空间。 3.定义对象的三种方式 (1)先定义类,后定义对象,例如: Student stu1,stu2; (2)定义类的同时定义对象,例如: class Student stu1,stu2; (3)直接定义对象,例如: class stu1,stu2; 4.对象成员的引用 每个由类定义的对象都有若干个数据成员与成员 函数,在类外通过对象可以使用公有的数据成员及成 员函数。 (1)引用数据成员的格式为: (2)调用成员函数的格式为: (实参) 注意:在类内引用本类的数据成员或调用本类的成员函 数时,不能加对象名。 5.对象的赋值运算 同类对象之间所能进行的惟一运算就是赋值 运算,赋值运算的格式为: =; 【例9.4】定义描述学生成绩的类Student,然后用Student 定义一个学生对象stu。在主函数中输入学生的姓名、物理 、数学,并调用成员函数Input()输入到数据成员Name、 Phi、Math中,调用成员函数Average()计算平均成绩,调 用成员函数Output()将对象stu的私有数据成员返回给主函 数,并显示其值。最后再调用成员函数Display()显示私有 数据成员的值。 例程 对象的使用说明 (1)定义对象时,编译系统为不同对象的数据成员分配不 同的内存空间; (2)不能在类外直接对其私有数据成员进行操作,如: stu.Phi=90;是错误的。而只能通过公有成员函数Input() 对其进行赋值操作,这样就保证了数据的安全性。 (3)对象允许进行赋值运算。同类对象的赋值运算将stu1 的所有数据成员值赋给stu2对应的数据成员。 (4)对象作为函数参数时,属于值传送。只能通过函数返 回对象值,而不能通过形参返回运算结果。 (5)在定义对象时可对公有数据成员进行初始化赋值,但 不能对私有或保护数据成员进行初始化赋值。私有或保 护数据成员只能通过构造函数进行初始化赋值。 9.3 构造函数 构造函数主要作用是在定义对象时,对其数 据成员进行初始化。 9.3.1 构造函数的定义 1.构造函数的定义格式 : () 构造函数体 注意:构造函数的函数名必须与类名相同,且无返回数据类 型。若在类内定义构造函数,则“:”可省去 。 【例9.5】在【例9.4 】的学生成绩类Student中定 义构造函数,用构造函数实现对象stu1的初始化 赋值。 例程 2.对构造函数的说明 (1)构造函数名必须与类同名。 (2)定义构造函数时,不能定义函数返回值的类型 ,也不能指定为void 类型。因构造函数无需返回 函数值 。 (3)构造函数可重载,其参数可有可无,也可指定 默认值。 (4)若要用类定义对象,则构造函数必须是公有成 员函数。若类仅用于派生其它类,则构造函数可定 义为保护成员函数。 9.3.2 用构造函数初始化对象的过程 用构造函数初始化对象的过程,实际上就是对构 造函数的调用过程。其步骤为: (1)程序执行到定义对象语句时,系统为对象分配内 存空间; (2)系统自动调用构造函数,将实参传送给形参,执 行构造函数体时,将形参值赋给对象的数据成员。 【例9.6】定义描述矩形的类。用构造函数完成矩形 对象的初始化,编写计算矩形面积的函数,并输出矩 形面积。 例程 用构造函数初始化对象时的注意点 (1)定义无参对象时,对象后不能跟“( )”。 (2)类已定义构造函数前提下,有参( 无参)对象必须定义带参(无参)构造 函数 9.3.3 默认构造函数 默认构造函数有三类: (1)编译器产生的缺省构造函数(前提:用户未定义 构造函数) 格式: :( ) ;/该构造函数什么也不做。 (2)无参构造函数 (3)各参数均有默认值的构造函数 默认构造函数必须惟一。 9.3.4 拷贝的构造函数 用类定义对象时,可用拷贝功能的构造 函数将另一个已存在对象的数据拷贝到新 建的对象中。 拷贝构造函数的格式为: :(类名 9.5 构造函数和对象成员 在一个类的定义中,若定义有n个对象成员,则其 构造函数的一般格式为: :(形参表):(实参表1) ,(实参表n) 构造函数体 其中:(实参1),(实参n) 称为成员初始化表。 【例9.12】定义一个描述矩形的类与一个描述长方体 的类,用矩形类的对象作为长方体类的成员,讨论长 方体类中的构造函数与对象成员的初始化过程。例程 对构造函数的几点说明 (1)形参必须带有类型说明,而实参是可计算值的表达式 。 (2)对象成员构造函数的调用顺序取决于这些对象成员在 类中的说明顺序,而与它们在成员初始化表的位置无关。 (3)建立类的对象时,先调用各个对象成员的构造函数, 初始化相应的对象成员,然后才执行类的构造函数,初始 化类中其它成员。析构函数的调用顺序与构造函数正好相 反。 【例9.13】说明构造函数与析构函数的调用顺序。 例程 9.6 this指针 用类定义一个对象时,系统会自动建 立一个指向该对象的指针变量,该指针变 量称this指针,this指针变量指向所定义的对 象。 this 指针具有如下形式的默认说明: * const this= 本章小结 1类的定义 类:类由描述某类事物的数据(数据成员)及处理数据的函 数(成员函数)组成。类的定义格式为: class public: /定义公有数据成员或成员函数, private: /定义私有数据成员或成员函数 protected: /定义保护数据成员或成员函数 成员的访问属性 public(公有成员 ) private(私有成员 ) protected(保护成员) 公有数据成员允许类内或类外函数访问 公有成员函数允许在类内或类外调用 私有数据成员只允许类内函数访问 私有成员函数只允许在类内调用 保护数据成员只允许类或其子类中函 数访问 保护成员函数允许在类内或其子类中调用 2.对象 对象:用类定义的变量称为对象。对象的定义格式 : , , ; 对象的成员分为数据成员与成员函数两类。 在类外: 数据成员引用方式为:.; 成员函数的调用方式为:.(实参) ; 在类内引用或调用时,不写对象名。 3.构造函数与析构函数 (1)构造函数用于对象数据成员的初始化。构造函 数名必须与类名相同,且无返回类型。 构造函数允许重载,将无参或有默认值参数的 构造函数称为默认的构造函数。当用户没有定义 构造函数时,系统会自动产生一个默认的构造函 数,该构造函数体为空。 常用的构造函数有三类:有参构造函数、无参 构造函数与拷贝构造函数。拷贝构造函数的形参 必须为类的对象。 构造函数与析构函数 (2)析造函数名由类名前加“”组成,且无参 数及返回类型。其作用是撤消对象,并回收对 象占用的内存空间。 (3)构造与析构函数的调用 用类说明一个对象时,系统先为其分配内存空间, 再调用构造函数对数据成员进行初始化。当对象结束 其生命期,系统调用析构函数,回收对象所占用的内 存空间。 构造函数与析构函数 (4)构造函数与对象成员 在建立新类时,允许用已存在的类定义对象 成员,类的构造函数格式为: :(形参):(实参表1) ,(实参表2),(实参表n) 函数体 构造函数的调用顺序是,先调用各对象成员 的构造函数,再调用类本身的构造函数。 析构函数的调用顺序与构造函数正好相反。 4.new与delete 运算符 new 运算符用于动态建立对象,用new动态 建立对象时,系统先为对象分配内存空间,后调 用构造函数对对象初始化。用new运算符动态建 立的对象,必须用delete运算符撤消。 delete运算符用于撤消动态建立的对象,用 delete 运算符撤消动态建立的对象时,系统先调 用析构函数,并由析构函数回收对象占用的内存 空间。 5.this指针 用类定义一个对象时,由系统自 动建立指向该对象的指针称为this指 针。 this 指针的默认定义格式: * const this= 例9.1(1) #include struct Student char Name8; /学生姓名 float Phi,Math,Ave; /物理、数学、平均成绩 ; void Average(Student void Display(Student s) /输入姓名与成绩 coutstu.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 name,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() cout # include class Student private: char Name8; float Phi,Math,Ave; public: void Input(char name,float phi,float math); void Average(void) Ave=(Phi+Math)/2; void Display( void) coutnamephimath; stu1.Input(name,phi,math); stu1.Average(); stu1.Output(name,phi,math,ave); cout # include class Student private: char Name8; float Phi,Math,Ave; public: Student(char name,float phi,float math); void Display( void) cout # include class Rectangle private: int Left, Top, Right,Bottom; public: Rectangle(int L, int T, int R,int B) cout # include class Rectangle private: int Left,Right,Top,Bottom; public: Rectangle(int L,int R,int T,int B) cout # include class Rectangle private: int Left, Top, Right,Bottom; public: Rectangle(int L, int T, int R,int B) coutArea()Area() # include class Rectangle private: int Left,Top, Right,Bottom; public: Rectangle(int L,int T, int R,int B) cout class Complex private: float Real,Image; /定义复数实部与虚部为私有数据成员 public: Complex(float R=0,float I=0) /定义带参构造函数 cout class Complex public: float Real,Image; public: Complex(float R,float I) Real=R; Image=I; 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 调用了析构函数! 调用了析构函数! 返回 例9.12(1) # include class Rectangle /定义描述矩形的类Rectangle private: int Length,Width; public: Rectangle(int l,int w) Length=l; Width=w; int Area( ) return Length*Width; ; 例9.12(2) class Cuboid /定义描述长方体的类Cubio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论