《c程序设计基础》第七章-类和对象.ppt
《《c程序设计基础》第七章-类和对象.ppt》由会员分享,可在线阅读,更多相关《《c程序设计基础》第七章-类和对象.ppt(178页珍藏版)》请在三一办公上搜索。
1、C+程序设计基础,第7章 类与对象北京邮电大学信通院方莉,2,第7章 类与对象,类是实现C+面向对象程序设计的基础。面向对象程序设计的基本特点有:抽象、封装、继承和多态。类把数据和函数封装在一起,是C+封装的基本单元。本章主要内容类的使用、定义和实现面向对象分析和面向对象设计,7.1 类和对象的定义7.2 对象的使用7.3 构造函数7.4 析构函数 7.5 类的静态成员 7.6 类成员的保护和使用7.7 运算符重载 7.8 类的组合7.9 面向对象分析和设计,第7章 类与对象,4,7.1 类和对象的定义,一个类表示现实生活中的一类事物,比如“学生”,事物有相应的特征或属性,它们就是类的数据成员
2、;事物可能有行为动作,也可能被某些行为动作所操作,这些都用函数来实现,这些函数和类有着不可分割的关系,是构成类的函数成员,或者叫成员函数。在C+中,类实际上相当于一种用户自定义的数据类型。,5,在定义了类类型后,就可以定义该类型的变量,这个变量就称为类的对象(或实例)。对象是一类事物中的一个具体的个体。从程序设计的角度来看,对象就相当于变量。,7.1 类和对象的定义,6,举例:,class Student/类的定义private:int id;char20 name;int age;float score;public:void getscore()void printstu();,7.1 类
3、和对象的定义,7,7.1.1 使用类对象,如果已经知道某个类的功能和接口函数,就可以使用它了。先定义类对象,通过对象调用接口函数实现一定的功能。class Student stu01;/class也可以省略不写 Student stu01;stu01.getscore();stu01.printstu();这个过程的本质是:根据对象所需要完成的任务,向对象发送消息。对象收到消息后,调用接口中的相应的函数,完成它的功能。对象只需要知道“做什么”,具体工作由成员函数来完成。,8,class Student/类的定义 private:int id;char name 20;float score;p
4、ublic:void GetData();void PrintData();,类的声明:具体说明类的组成class 类名 private:/数据成员protected:/保护成员public:/成员函数;一般写在类的.h文件中,也可以写在类的.cpp文件之首。,7.1.2 类的声明,9,类实际上是一种用户自定义的数据类型。比较:,struct student int id;char20 name;float score;,class Student private:int id;char name20;float score;public:void GetData();void PrintDa
5、ta();,同是自定义的类型。在无显式声明时,结构体的成员是公有的,类的成员是私有的。,7.1.2 类的声明,10,分析:任何一个时钟应该有时、分、秒的值,这就是时钟的属性特征;时钟的操作应该有设置时间、显示时间等。画出时钟类的标记图如下:,例:要声明一个时钟类,11,举例:class Clock public:void SetTime(int newH,int newM,int newS);void ShowTime();private:int Hour;int Minute;int Second;,7.1.2 类的声明,12,举例:class Point public:void SetXY
6、(int x,int y);void GetXY(int,7.1.2 类的声明,13,关键字public、protected、private说明类成员的访问控制属性。私有(private)成员只允许本类的成员函数来访问;公有(public)成员是类对外的接口,在类声明和类(函数)实现之后,类的对象可以访问公有成员。保护型(protected)成员,对于类外其它函数,其可访问性和私有成员的性质相似。,7.1.2 类的声明,14,关于访问控制属性,注意:在类声明中,三种访问控制属性,可以按任意次序出现,也可以不出现。public等关键字也可以多次出现,但是一个成员只能具有一种访问控制属性。如果不写
7、访问控制属性关键字,默认的是private。在书写时通常习惯将公有类型放在最前面,这样便于阅读,因为它们是外部访问时所要了解的。一般情况下,一个类的数据成员应该声明为私有成员,这样封装性较好。一个类应该有一些公有的函数成员,作为对外的接口,否则别的代码无法访问类。,7.1.2 类的声明,15,“类的成员”既可以是数据成员,也可以是成员函数的原型。数据成员,表示类的属性,声明方式与一般变量相同。成员函数,描述类的对象可以进行的操作,一般在类中声明原型,在类声明之外定义函数的具体实现。,7.1.2 类的声明,16,类的成员函数描述的是类的行为或操作。在类声明中,声明函数的原型。(类的声明文件.h文
8、件)函数的具体实现一般写在类声明之外。(类的实现文件.cpp文件)在类的外部定义成员函数的语法形式为:返回值类型 类名:成员函数名(参数表)函数体,7.1.3 类的成员函数,17,例:时钟类Clock的成员函数的实现:void Clock:SetTime(int newH,int newM,int newS)Hour=newH;Minute=newM;Second=newS;void Clock:ShowTime()coutHour:Minute:Secondendl;,7.1.3 类的成员函数,18,class Clock public:void SetTime(int NewH,int N
9、ewM,int NewS);void ShowTime();private:int Hour,Minute,Second;,void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour“:”Minute“:”Secondendl;,Clock类的声明和实现,19,成员函数描述类的行为(或服务、操作);实现程序的算法,是对类封装的数据进行操作的唯一途径。在类定义中说明原型(一般在.h文件中),在类的实现文件(.cpp)中定义函数体,并在函数
10、名前使用类名加以限定,标示它与类之间的关系。也可以直接在类中定义函数体,形成内联成员函数。允许定义重载函数和带缺省形参值的成员函数。在声明成员函数时,可以控制访问权限;一般将成员函数设为公有型的。,7.1.3 类的成员函数,20,/Tdate.h 类的声明文件class Tdatepublic:void Set(int m,int d,int y);/置日期值 int IsLeapYear();/判是否闰年 void Print();/输出日期值private:int month;int day;int year;,21,/Tdate.cpp 类的实现文件void Tdate:Set(int
11、m,int d,int y)month=m;day=d;year=y;int Tdate:IsLeapYear()return(year%4=0,22,内联函数:如果在类的内部定义成员函数的具体实现,则该成员函数为内联成员函数。函数定义时没有任何的附加说明,所以称为隐式声明的内联成员。显示内联函数(用 inline),7.1.3 类的成员函数,23,class Point public:void SetXY(int x,int y)m_x=x;m_y=y;void GetXY(int,7.1.3 类的成员函数,24,class Clock public:void SetTime(int New
12、H,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;,inline void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;inline void Clock:ShowTime()coutHour“:”Minute“:”Secondendl;,显式声明的内联函数,7.1.3 类的成员函数,25,带默认参数值的成员函数类的成员函数也可以有默认形参值,其调用规则同普通函数相同。例如时钟类的SetTime()函数,
13、使用默认值:void Clock:SetTime(int newH=0,int newM=0,int newS=0)Hour=newH;Minute=newM;Second=newS;,7.1.3 类的成员函数,26,重载函数成员函数可以用与普通函数同样的方法重载。例:class Point public:void Set(int x,int y);void Set(int x,int y,int color);void Get(int,7.1.3 类的成员函数,27,注意,类名是成员函数名的一部分,所以一个类的成员函数与另一个类的成员函数即使同名,也不能认为是重载。,class Clock
14、public:void Set(int NewH,int NewM,int NewS);void Show();private:int Hour,Minute,Second;,class Point public:void Set(int x,int y);void Get(int,7.1.3 类的成员函数,28,对象是一类事物中的个体,从程序设计的角度来看,对象就相当于变量。定义一个对象和定义一个一般变量相同。类名称 对象名称例 Clock ck1;Point point1;,7.1.4 对象,29,定义变量时要分配存储空间,同样,定义一个对象时要分配存储空间,一个对象所占的内存空间是类的数
15、据成员所占的空间总和。类的成员函数存放在代码区,不占内存空间。类的成员是抽象的,对象的成员才是具体的。类的数据成员都不会有具体的属性值。只有对象的成员才会有具体的属性值。,7.1.4 对象,30,对象的使用:根据类的功能和接口函数,定义对象,通过对象调用接口函数实现一定的功能。声明了类及其对象,在类的外部(即在类定义和成员函数的实现代码之外),就可以访问对象的公有成员(包括数据成员和函数成员)了。语法形式为:对象名.公有数据成员对象名.公有成员函数名(参数表),7.1.4 对象,31,使用对象的过程:根据对象所需要完成的任务,向对象发送消息。对象收到消息后,调用接口中的相应的函数,完成它的功能
16、。对象只需要知道“做什么”,具体工作由成员函数来完成。例:class student stu1;或 student stu1;stu1.GetData();stu1.PrintData();,7.1.4 对象,class Student/类的定义 private:int id;char name 20;float score;public:void GetData();void PrintData();,32,例如,在主函数中定义了Clock类的对象:void main()Clock myclock;myclock.SetTime(12,5,0);myclock.ShowTime();,执行m
17、ain()函数时的内存分配情况,33,在类的外部,只能通过对象访问类的公有成员;在类的成员函数内部,可以直接访问类的所有成员,这就实现了对访问范围的有效控制。,void Clock:SetTime(int newH=0,int newM=0,int newS=0)Hour=newH;minute=newM;Second=newS;,class Clock public:void Set(int NewH,int NewM,int NewS);void Show();private:int Hour,Minute,Second;,void main()Clock myclock;myclock.
18、SetTime(12,5,0);myclock.ShowTime();,7.1.4 对象,34,类作用域是指类定义和相应的成员函数定义的范围,通俗地称为类的内部。一个类的全部成员都是一个整体的相关部分。一个类的所有成员位于这个类的作用域内,在该范围内,一个类的成员函数对本类的其它成员具有无限制的访问权。,7.1.5 类的作用域与可见性,35,例7.2:编程测试类的作用域范围。#include using namespace std;class Sample private:int a;void fa();,protected:float b;void fb();public:char c;vo
19、id set();void display();,7.1.5 类的作用域与可见性,36,void Sample:fa()cout In function faendl;couta b cendl;void Sample:fb()cout In function fbendl;couta b cendl;,7.1.5 类的作用域与可见性,37,void Sample:set()a=10;b=5.5;c=K;void Sample:display()cout In function displayendl;fa();,在类的成员函数里,可以访问类的任何成员,7.1.5 类的作用域与可见性,38,v
20、oid main()Sample s;/s.a=10;/编译时会出错,在类的外部不能访问类的私有成员/s.b=5.5;/编译时会出错,在类的外部不能访问类的保护成员s.c=K;s.set();/s.fa();/编译时会出错,在类的外部不能访问类的私有成员/s.fb();/编译时会出错,在类的外部不能访问类的保护成员s.display();,7.1.5 类的作用域与可见性,39,类名实际是个类型名,允许类名与其它变量名或函数名相同。在类的内部,外部与类名同名的全局变量名或函数名不可见。在一个函数内,同名的类名和变量名可以同时使用,都是可见的。,7.1.5 类的作用域与可见性,40,例:若Samp
21、le类已定义,以下函数的定义是没有问题的:void func()class Sample a;/定义对象时要用到类名,加前缀class int Sample=10;/变量名和类名相同 Sample+;/.但是从程序可读性考虑,一般还是不要让类名和其他变量名、函数名用同样的名字。,7.1.5 类的作用域与可见性,41,要声明一个时钟类,任何一个时钟都应该有时、分、秒的值,这就是时钟的属性特征;时钟的操作应该有设置时间、显示时间等。,7.1.6 时钟类举例,42,/声明时钟类的头文件:Clock.h#include using namespace std;class Clock/类的声明publi
22、c:void SetTime(int newH=0,int newM=0,int newS=0);void ShowTime();void ShowTime(int n);private:int Hour;int Minute;int Second;,7.1.6 时钟类举例,43,/实现类成员函数的源文件:Clock.cpp#include Clock.hvoid Clock:SetTime(int newH,int newM,int newS)/SetTime()函数定义 Hour=newH;Minute=newM;Second=newS;void Clock:ShowTime()/Show
23、Time()函数定义 coutHour:Minute:Secondendl;void Clock:ShowTime(int n)/重载函数的定义 coutHour点Minute分Second秒endl;,7.1.6 时钟类举例,44,/测试应用程序:7-1.cpp#include Clock.hvoid main()Clock myclock;/类的对象 myclock.SetTime(12,5,0);/设置时间 myclock.ShowTime();/第一种方式显示时间 myclock.ShowTime(1);/第二种方式显示时间,7.1.6 时钟类举例,7.1 类和对象的定义7.2 对象的
24、使用7.3 构造函数7.4 析构函数 7.5 类的静态成员 7.6 类成员的保护和使用7.7 运算符重载 7.8 类的组合7.9 面向对象分析和设计,第7章 类与对象,46,对象是类的一个具体的实例,类和对象的关系相当于普遍与特殊的关系。在C+中,类是一个自定义的数据类型,对象是该数据类型的一个变量。在大型程序开发中,类的定义和实现可以作为一个完整的程序模块,在其它的程序模块中可以定义对象,通过对象访问公有成员函数,模块与模块之间的接口就是那些公有成员函数。,7.2 对象的使用,47,定义一个全局的对象可以在函数体中定义一个局部的对象动态地从堆中申请空间来创建一个对象可以定义对象数组使用对象作
25、为函数的参数与返回值。,7.2 对象的使用,48,声明对象指针的一般语法形式为:类名*对象指针名;使用对象指针访问对象的成员,语法形式为:对象指针名-公有成员;例如:Clock c;/在栈中分配Clock型存储空间Clock*pc1=new Clock;/在堆中分配Clock型存储空间Clock*pc2=,1.对象指针,49,void main()Clock*pmyclock=new Clock;pmyclock-SetTime(12,5,0);pmyclock-ShowTime();delete pmyclock;,1.对象指针,50,问:一个类中所有对象调用的成员函数都执行同一段代码。那么
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c程序设计基础 程序设计 基础 第七 对象
链接地址:https://www.31ppt.com/p-5896070.html