七章节类与对象ppt课件_第1页
七章节类与对象ppt课件_第2页
七章节类与对象ppt课件_第3页
七章节类与对象ppt课件_第4页
七章节类与对象ppt课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章第七章 类与对象类与对象教学目的l(1) 了解以类与对象为中心的面向对象程序设计的根本思想,包括封了解以类与对象为中心的面向对象程序设计的根本思想,包括封装、承继和多态性的概念及其在面向对象程序中的表达;装、承继和多态性的概念及其在面向对象程序中的表达;l(2) 掌握类的定义方法;掌握类的定义方法;l(3) 掌握类成员的访问权限控制;掌握类成员的访问权限控制;l(4) 掌握对象的创建与运用方法;掌握对象的创建与运用方法;l(5) 了解构造函数与析构函数的定义与运用。了解构造函数与析构函数的定义与运用。l(6) 了解类的承继与派生、运算符重载、以及模板等概念。了解类的承继与派生、运算符重载

2、、以及模板等概念。根本内容 l7.1 面向对象程序设计概述面向对象程序设计概述l7.2 类与对象类与对象l7.3 承继承继7.1 面向对象程序设计概述l两种程序设计思想两种程序设计思想: :l面向过程的程序设计面向过程的程序设计(Structure (Structure Programming)Programming)l以功能为中心,采用函数来描画操作以功能为中心,采用函数来描画操作( (动词动词) )l面向对象程序设计面向对象程序设计(Object Oriented (Object Oriented Programming)Programming)l以数据为中心,采用对象来描画内部属性和以数

3、据为中心,采用对象来描画内部属性和操作方法操作方法( (名词名词) )对象和面向对象l客观世界客观世界实体实体l例:人类例:人类l静态特征属性静态特征属性attributeattributel姓名、性别、年龄、班级姓名、性别、年龄、班级/ /单位、身高等单位、身高等l动态特征行为动态特征行为behaviorbehavior l吃饭、睡觉、说话、走路、上课吃饭、睡觉、说话、走路、上课/ /上班等上班等l例:汽车例:汽车l静态特征属性静态特征属性attributeattributel品牌、消费厂、型号、颜色等品牌、消费厂、型号、颜色等l动态特征行为动态特征行为behaviorbehavior l行

4、驶、转弯、鸣笛、刹车等行驶、转弯、鸣笛、刹车等面向对象的根本特征l笼统:数据笼统笼统:数据笼统+ +代码笼统代码笼统l封装:过程和数据封藏起来封装:过程和数据封藏起来l承继:基类和派生类承继:基类和派生类l多态性:虚函数、函数重载多态性:虚函数、函数重载OOP的优点l开发时间短,效率高,可靠性高,所开发开发时间短,效率高,可靠性高,所开发的程序更强健的程序更强健l重用,共享,可维护性,精简重用,共享,可维护性,精简l适宜于大程序长时间的开发任务适宜于大程序长时间的开发任务7.2 类与对象l7.2.1 类的定义类的定义l7.2.2 成员函数成员函数l7.2.3 对象的运用对象的运用l7.2.4

5、构造函数与析构函数构造函数与析构函数类(Class) -数据类型l类是具有一样属性和一样的方法的对象的集合,类是具有一样属性和一样的方法的对象的集合,它是一种既包含数据又包含函数的笼统数据类它是一种既包含数据又包含函数的笼统数据类型。型。l类的构成类的构成l数据成员数据成员Data Member,即类的属性;,即类的属性;l成员函数成员函数Member Function,即类的方法;,即类的方法;7.2.1 类的定义 class 类名类名 private:/私有成员私有成员 私有的数据成员和成员函数;私有的数据成员和成员函数;protected:/维护成员维护成员 维护的数据成员和成员函数;维

6、护的数据成员和成员函数;public:/公有成员公有成员 公有的数据成员和成员函数;公有的数据成员和成员函数;;访问控制权限 l私有部分私有部分private:数据成员和成员函数只:数据成员和成员函数只能在该类的范围内被本类的成员函数访问能在该类的范围内被本类的成员函数访问表达类的封装性表达类的封装性 l维护部分维护部分protected:与私有成员的性质类:与私有成员的性质类似似l公有部分公有部分public:成员既可以被本类的成员:成员既可以被本类的成员函数访问,也在类外被该类的对象访问函数访问,也在类外被该类的对象访问对对外界的接口外界的接口 例:定义一个狗类(Dog)class Dog

7、private:char name20;/ 狗的名字狗的名字intage;/ 狗的年龄狗的年龄public:voidset(char *n, int a);/ 设置数据成员值的函数设置数据成员值的函数voiddisplay();/ 输出数据成员值的函数输出数据成员值的函数voidspeak();/ 发出狗叫声的函数发出狗叫声的函数;7.2.2 成员函数l成员函数的普通方式:成员函数的普通方式:l函数类型函数类型 类名类名 : : 函数名函数名 ( ( 参数表参数表 ) )l l函数体函数体l 类的作用域 l一个类的一切数据成员和成员函数都在该类的作用域内一个类的一切数据成员和成员函数都在该类的

8、作用域内包括在类声明外部定义的成员函数包括在类声明外部定义的成员函数l类中的每个成员都可以直接访问本类中的其他任何成员。类中的每个成员都可以直接访问本类中的其他任何成员。l假设在类作用域之外对该类的数据成员和成员函数进展假设在类作用域之外对该类的数据成员和成员函数进展访问,那么要遭到一定的限制,有时甚至是不允许的。访问,那么要遭到一定的限制,有时甚至是不允许的。例:Dog类成员函数的定义void Dog:set(char *n, int a)strcpy(name,n);age = a;void Dog:display()coutnametageendl;void Dog: speak()co

9、utArf!Arf!endl;/ Dog类较完好的定义类较完好的定义class Dog private:char name20;intage;public:voidset(char *n, int a);voiddisplay();voidspeak();void Dog:set(char *n, int a)strcpy(name,n);age = a;void Dog:display()coutnametageendl;void Dog: speak()coutArf!Arf!endl;/ 当成员函数比较简单时,可在类定义中直接给出函数体当成员函数比较简单时,可在类定义中直接给出函数体cl

10、ass Dog private:char name20;intage;public:voidset(char *n, int a)strcpy(name,n);age = a;voiddisplay()coutnametageendl;voidspeak()coutArf!Arf! - 运算符运算符例7-1: Dog类和对象int main()char name020;int age0;Dog dog1, dog2;cout name0 age0;dog1.set (name0, age0);cout 第一条狗:第一条狗: endl;dog1.display();dog1.speak();do

11、g2.set (LaiFu, 2);cout 第二条狗:第二条狗: endl;dog2.display ();dog2.speak();dog1=dog2;/ 同类对象之间可以相互赋值同类对象之间可以相互赋值cout 对象赋值后的第一条狗:对象赋值后的第一条狗: endl;dog1.display();dog1.speak();return 0;对象的运用成员函数可直接访问本类中定义的数据成员公成员函数可直接访问本类中定义的数据成员公有和私有有和私有类的作用域内类的作用域内类的对象访问其公有数据成员或成员函数需运用类的对象访问其公有数据成员或成员函数需运用运算符运算符“制止直接访问一个对象中的

12、私有制止直接访问一个对象中的私有/ /维护成员维护成员同类对象之间可以整体赋值同类对象之间可以整体赋值对象用作函数的参数时属于赋值调用;函数可以对象用作函数的参数时属于赋值调用;函数可以前往一个对象。前往一个对象。 7.2.4 构造函数与析构函数l构造函数构造函数ConstructorConstructor是类的一个特殊成员是类的一个特殊成员函数,定义了创建对象的方法,提供了初始化函数,定义了创建对象的方法,提供了初始化对象的一种简便手段。对象的一种简便手段。l与构造函数相对应,析构函数与构造函数相对应,析构函数DestructorDestructor用于吊销一个对象,完成释放对象成员所占存用

13、于吊销一个对象,完成释放对象成员所占存储空间的任务。储空间的任务。 构造函数构造函数Constructorl格式:格式:l类名类名 : : 类名类名 ( (参数表参数表) )l l函数体函数体l l本卷须知:本卷须知:l构造函数必需与类名一样构造函数必需与类名一样l构造函数没有前往值构造函数没有前往值l其功能是对对象进展初始化,普通由一系列赋其功能是对对象进展初始化,普通由一系列赋值语句构成值语句构成l由系统自动调用由系统自动调用析构函数析构函数Destructorl格式为:格式为:l类名类名:类名类名();l本卷须知:本卷须知:l函数名与类名一样,只是在前边加函数名与类名一样,只是在前边加“

14、符号符号l析构函数不得前往任何值析构函数不得前往任何值l析构函数不得带有任何参数析构函数不得带有任何参数l其功能是释放对象成员所占用的存储,普通由其功能是释放对象成员所占用的存储,普通由一系列的一系列的delete组成组成l由系统自动调用由系统自动调用例7-2: 运用构造函数和析构函数的Dog类class Dog char name20;intage;public:Dog()/ 构造函数构造函数1strcpy(name, XXX);age = 0;Dog(char *n, int a)/ 构造函数构造函数2strcpy(name, n);age = a;Dog()/ 析构函数析构函数cout析

15、构函数被调用析构函数被调用endl;voiddisplay() coutnametageendl;voidspeak() coutArf!Arf!endl;7.3 承继l7.3.1 派生类的定义派生类的定义l7.3.2 派生类的承继方式和访问属性派生类的承继方式和访问属性l7.3.3 派生类的构造函数和析构函数派生类的构造函数和析构函数生物类的层次关系7.3.1 派生类的定义l派生类的定义格式为:派生类的定义格式为:lclass 派生类名:承继方式派生类名:承继方式 基类名基类名1,承继,承继方式方式 基类名基类名2,承继方式,承继方式 基类名基类名nll派生类添加的成员声明;派生类添加的成员

16、声明;l; /人员类定义人员类定义class Personprotected:char Name10; /姓名姓名char Sex;/性别性别public:void ShowMe() /显示数据成员显示数据成员cout Namet Sexn;/雇员类定义雇员类定义class Employee : public Person char Dept20;/任务部门任务部门public:void ShowMe() /显示数据成员显示数据成员cout Namet Sext Dept n;单承继的例子单承继的例子 /飞机类飞机类 class Planechar propeller; /螺旋桨螺旋桨publ

17、ic:void flying();/飞行方法飞行方法;/船类船类class Boatchar helm;/舵舵public:void floating();/飘浮方法飘浮方法;/水上飞机类水上飞机类 class Seaplane : public Plane, public Boat;多承继的例子多承继的例子 7.3.2 派生类的承继方式和访问属性l私有承继私有承继privatel公有承继公有承继publicl维护承继维护承继protected派生类的定义格式class 派生类名:派生类名:private | protected | public 基类名基类名private:protected

18、:public:;系统的默许值是私有承继系统的默许值是私有承继公有承继(public)l以公有承继方式创建的派生类对基类各种成员访问权限以公有承继方式创建的派生类对基类各种成员访问权限如下如下 :l基类公有成员相当于派生类的公有成员,即派生类可以基类公有成员相当于派生类的公有成员,即派生类可以象访问本身公有成员一样访问从基类承继的公有成员。象访问本身公有成员一样访问从基类承继的公有成员。 l基类维护成员相当于派生类的维护成员,即派生类可以基类维护成员相当于派生类的维护成员,即派生类可以象访问本身的维护成员一样,访问基类的维护成员。象访问本身的维护成员一样,访问基类的维护成员。 l对于基类的私有

19、成员,派生类无法直接访问。对于基类的私有成员,派生类无法直接访问。私有承继 (private)l派生类对基类各种成员访问权限如下派生类对基类各种成员访问权限如下 :l基类公有成员和维护成员都相当于派生类的私有成员,基类公有成员和维护成员都相当于派生类的私有成员,派生类只能经过本身的函数成员访问它们;派生类只能经过本身的函数成员访问它们; l对于基类的私有成员,无论派生类内部成员或派生类运对于基类的私有成员,无论派生类内部成员或派生类运用者都无法直接访问。用者都无法直接访问。 维护承继(protected)l派生类对基类各种成员访问权限如下 :l基类的公有成员和维护成员都相当于派生类的维护成员,

20、派生类可以经过本身的成员函数或其子类的成员函数访问它们l对于基类的私有成员,无论派生类内部成员或派生类运用者都无法直接访问 基类成员在派生类中的访问属性基类中的成员基类中的成员在派生类中的访问属性在派生类中的访问属性公有派生公有派生私有派生私有派生保护派生保护派生公有成员公有成员公有公有私有私有保护保护私有成员私有成员不可访问不可访问不可访问不可访问不可访问不可访问保护成员保护成员保护保护私有私有保护保护/ 例例7-3:派生类的定义及运用:派生类的定义及运用#include #include using namespace std;class Person/人员类定义人员类定义char Nam

21、e10;/姓名姓名intAge;/年龄年龄public:void Set(char *name, int age)/设置数据成员设置数据成员strcpy(Name, name);Age = age;void Display()coutNametAgetendl; ;class Student : public Person/学生类定义公有承继学生类定义公有承继int Number;/ 学号学号char ClassName10;/ 班级班级public:voidSetStu(char *classname, int number, char *name, int age) strcpy(Clas

22、sName, classname); Number = number;Set(name, age); /派生类成员函数直接运用基类的公有成员派生类成员函数直接运用基类的公有成员voidDisplayStu()cout Number t ClassName t; Display();/派生类成员函数直接运用基类的公有成员派生类成员函数直接运用基类的公有成员;int main()Student stu1;stu1.SetStu(计算机计算机21, 95071007, 张三张三, 19);stu1.Display();/派生类对象直接运用基类的公有成员派生类对象直接运用基类的公有成员stu1.Dis

23、playStu();return 0;7.3.3 派生类的构造函数和析构函数l派生类构造函数的普通方式为:派生类构造函数的普通方式为:l派生类名派生类名:派生类名参数总表派生类名参数总表: :基类名基类名1 1参数表参数表1 1,l,基类名,基类名n n参数表参数表n n,内嵌对象名,内嵌对象名1 1对象对象参数表参数表1 1,l,内嵌对象名,内嵌对象名m m对象参数表对象参数表m ml l派生类新添加成员的初始化;派生类新添加成员的初始化;l 派生类构造函数的执行次序l首先,调用基类构造函数,调用顺序按照它们被承继时首先,调用基类构造函数,调用顺序按照它们被承继时声明的基类名顺序执行。声明的

24、基类名顺序执行。l其次,调用内嵌对象构造函数,调用次序按各个对象在其次,调用内嵌对象构造函数,调用次序按各个对象在派生类内声明的顺序。派生类内声明的顺序。l最后,执行派生类构造函数体中的内容。最后,执行派生类构造函数体中的内容。 析构函数 l派生类与基类的析构函数没有什么联络,彼此独立,派派生类与基类的析构函数没有什么联络,彼此独立,派生类或基类的析构函数只作各自类对象消亡前的善后任生类或基类的析构函数只作各自类对象消亡前的善后任务。务。l派生类析构函数执行过程恰与构造函数执行过程相反。派生类析构函数执行过程恰与构造函数执行过程相反。l首先执行派生类析构函数首先执行派生类析构函数l然后执行内嵌

25、对象的析构函数然后执行内嵌对象的析构函数l最后执行基类析构函数最后执行基类析构函数 / 例例7-4:派生类构造函数和析构函数:派生类构造函数和析构函数#include #include using namespace std;class Person/人员类定义人员类定义char Name10;intAge;public:Person(char* name,int age)/构造函数构造函数strcpy(Name, name);Age = age;coutPerson类的构造函数被调用类的构造函数被调用endl; Person()/析构函数析构函数coutPerson类的析构函数被调用类的析构

26、函数被调用endl;void Display() coutNametAgetendl; ;class Student : public Person/学生类定义公有承继学生类定义公有承继int Number;char ClassName10;public:Student(char *classname, int number, char *name, int age) : Person(name, age) strcpy(ClassName, classname);Number = number;coutStudent类的构造函数被调用类的构造函数被调用 endl;Student() cout

27、Student类的析构函数被调用类的析构函数被调用endl; voidDisplayStu()cout Number t ClassName 和和“用作输入输出运算符用作输入输出运算符 7.4.1 运算符重载运算符重载 运算符重载的定义l方式:方式:l函数前往值类型函数前往值类型 类名类名: operator 运算符运算符 (参数表参数表)llll运算符重载实践也是一种函数重载运算符重载实践也是一种函数重载l函数函数 operator 运算符重载了运算符运算符重载了运算符/例例7-5: 重载复数类的运算符重载复数类的运算符class Complexdouble real, imag;publi

28、c:Complex(double r = 0, double i = 0) / 带默许参数值的构造函数带默许参数值的构造函数real=r; imag=i;double Real() return real;/ 取复数的实部取复数的实部double Imag() return imag;/ 取复数的虚部取复数的虚部Complex operator +(Complex &);/ 重载运算符重载运算符 Complex operator -(Complex &);/ 重载运算符重载运算符 ;Complex Complex:operator + (Complex &c)Compl

29、ex temp;temp.real = real+c.real;temp.imag = imag+c.imag;return temp;Complex Complex:operator - (Complex &c)Complex temp;temp.real = real-c.real;temp.imag = imag-c.imag;return temp;7.4.2 虚函数虚函数 l定义:定义:l在某基类中声明为在某基类中声明为virtual并在一个或多个并在一个或多个派生类中被重新定义的成员函数派生类中被重新定义的成员函数 l语法:语法:lvirtual 函数前往类型函数前往类型

30、函数名参数表函数名参数表ll 函数体函数体ll用途:用途:l实现多态性,经过指向派生类的基类指针,实现多态性,经过指向派生类的基类指针,访问派生类中同名覆盖成员函数访问派生类中同名覆盖成员函数例 7-6: 运用虚函数实现多态性#include using namespace std;class Animal /基类:动物类基类:动物类public:virtual void Speak() coutHow does a Animal speak?endl; ;class Cat : public Animal /派生类:猫类派生类:猫类public:virtual void Speak() co

31、utmiao!miao!endl; ; class Dog : public Animal/派生类:狗类派生类:狗类public:virtual void Speak() coutwang!wang!endl; ;虚函数的运用限制 l应经过指针或援用调用虚函数,而不要以对象名调用应经过指针或援用调用虚函数,而不要以对象名调用虚函数阐明语句;虚函数阐明语句;l在派生类中重定义的基类虚函数仍为虚函数,同时可在派生类中重定义的基类虚函数仍为虚函数,同时可以省略以省略virtualvirtual关键字;关键字; l在派生类重新定义时,必需与基类中的原型完全一样;在派生类重新定义时,必需与基类中的原型完全一样;否那么会成为普通的重载;否那么会成为普通的重载;l不能定义虚拟造函数,可以定义虚析构函数。不能定义虚拟造函数,可以定义虚析构函数。 笼统类 l纯虚函数纯虚函数 lvi

温馨提示

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

评论

0/150

提交评论