C++程序设计第7章类和对象的基础.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++程序设计第7章类和对象的基础.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 对象 基础
- 资源描述:
-
1、C+程序设计第7章类和对象的基础本章内容提要类与对象的定义 对象的初始化 成员函数的特性 静态成员 友元 类的作用域与对象的生存期 一、类与对象的定义什么是类?l类是一种新的数据类型。类是逻辑相关的函数和数据的封装,是对所处理的问题的抽象描述,所以,类是实现抽象类型的工具。l类(Class):是一种用户定义的类型,它包括定义的数据和其对应的操作(函数)。l使用对象将数据和操作进行封装(Encapsulation)。什么是对象?类实例化后便生成对象。对象(Object):含有数据(对象的属性Attribute)又含有对数据的操作代码(Method)的一个逻辑封装体。l属性:描述对象特征的数据。l
2、方法:对属性的操作。面向对象编程l利用对象进行程序设计1.类的定义 类的定义l一般分为说明部分和实现部分。l说明部分:类中的成员数据成员成员函数的说明l实现部分成员函数的具体定义l例如:定义一个汽车类l型号、外壳、车轮等(数据成员)l启动、加速和停止等(成员函数)类的定义格式:class public:private:protected:;例:坐标点类 问题:将坐标点与相应操作封装成类class TPoint public:void Setxy(int a,int b);/说明在类体内,定义在类体外说明在类体内,定义在类体外 void Move(int,int);/函数原型声明,参数名可给可不
3、给出函数原型声明,参数名可给可不给出 void Print();int Getx();int Gety();private:int x,y;/数据成员数据成员;例:坐标点类(续上)问题:将坐标点与相应操作封装成类void TPoint:Setxy(int a,int b)x=a;y=b;void TPoint:move(int a,int b)x=x+a;y=y+b;void TPoint:Print();coutx=Getx()y=Gety();int TPoint:Getx()return x;int TPoint:Gety()return y;在类体外定义成员函数的一般格式为:在类体外定
4、义成员函数的一般格式为:函数类型函数类型 类名类名:成员函数成员函数(参数表参数表)其中,作用域运算符其中,作用域运算符“:”是用来标识成员函数是属于哪个类的,是用来标识成员函数是属于哪个类的,“类名类名”是成员函数所属类的名字。若在函数前加关键词是成员函数所属类的名字。若在函数前加关键词inline,则成为则成为内联成员函数。内联成员函数。若函数较短,可以在类内定义,也称作若函数较短,可以在类内定义,也称作内联成员函数内联成员函数。例:坐标点类(内联函数形式)问题:将说明部分和实现部分都在类体内定义。class TPoint/类名类名public:/声明其后为公有成员声明其后为公有成员 vo
5、id Setxy(int a,int b)x=a;y=b;void Move(int a,int b)x=x+a;y=y+b;void Print()coutx=Getx()y=Gety();int Getx()return x;int Gety()return y;private:int x,y;/数据成员数据成员;2.对象的定义与使用 对象的定义格式:说明:l是定义对象所属类的名字。l可有多个对象名,用逗号分隔。例如:lTPoint p1,p2;/定义TPoint类型的对象p1和p2。lTPoint*p=&p1;/定义指向对象p1的TPoint类型的指针p。lTPoint&c=p2;/定义
6、c为TPoint类型对象p2的引用。lTPoint m5;/定义一个TPoint类型的对象数组。2.对象的定义与使用 对象中数据成员和成员函数的表示方式1:l.l.()例如:lp1.x,p1.y,p1.Setxy(2,3)对象中数据成员和成员函数的表示方式2:l-或者(*).l-()或者(*).()例如:lp-x,p-y,p-Getxy(int a,int b)或者(*p).x,(*p).y,(*p).Getxy(int a,int b)例7.1问题:对象的定义和成员函数的调用。#include#include Tpoint.hvoid main()TPoint p1,p2;TPoint*p=
7、&p1;p1.Setxy(1,2);coutx=p1.Getx()y=p1.Gety()endl;p2.Setxy(3,4);coutx=p2.Getx()y=p2.Gety()Setxy(5,6);/或或(*p).Setxy(5,6)coutx=Getx()y=Gety()Move(5,6);p1.Print();p2.Print();p-Print();该程序的运行结果为该程序的运行结果为x=1y=2x=3y=4x=5y=6x=11y=14x=6y=8x=11y=14对象定义的实质定义一个类,就相当于定义了一种类型,它并不会接受或存储具体的值,只作为一个样板,只有被实例化生成对象以后,系统
8、才为对象分配存储空间。为节省内存,在创建对象时,只为每个对象的数据成员分配内存,而成员函数只是一次性存放在静态存储区中,为所有的对象共享。例如:lTPoint p1,p2;类TPointint x,yvoid Setxy(int a,int b);void Move(int,int);void Print();int Getx();int Gety();p1对象int x,yp2对象int x,y二、对象的初始化 在类的定义中,无法用表达式初始化数据成员,因此,在声明一个对象时,对象的初始状态是不确定的,需要初始化。对象初始化可以使用:l构造函数l析构函数l复制构造函数1.构造函数 构造函数是
9、一种特殊的成员函数,它主要用来为对象分配空间,给他的数据成员赋值(初始化)并执行对象的其他内部管理操作。说明:l构造函数的名字必须与类的名字相同,并且构造函数无返回值,不允许定义构造函数的返回值类型,包括void类型。但允许有参数。l构造函数是成员函数,函数体可写在类体内,也可写在类体外。l构造函数可以重载。注意:构造函数在对象创建时由系统自注意:构造函数在对象创建时由系统自动调用,这是它与类的普通成员函数之动调用,这是它与类的普通成员函数之间的最大区别。间的最大区别。构造函数的定义格式如下:构造函数的定义格式如下::例7.2问题:构造函数的定义举例。#include class Tpoint
10、public:Tpoint(int m,int n)x=m;y=n;/定义构造函数定义构造函数int Getx()return x;int Gety()return y;private:int x,y;void main()Tpoint a(10,20);Tpoint b(15,25);couta.Getx(),a.Gety()endl;coutb.Getx(),b.Gety()endl;该程序的运行结果如下:该程序的运行结果如下:10,2015,252.析构函数 析构函数也是类中的特殊成员函数,与类名字相象,在前加一个波浪号“”。它没有参数,也没有返回值,在一个类中只能有一个析构函数。析构函
11、数执行与构造函数相反的操作。l通常用于释放分配给对象的存储空间,当程序超出类对象的作用域时,或者当对一个类指针使用运算符delete时,将自动执行析构函数。说明:l和构造函数一样,如果不定义析构函数,编译程序将提供一个缺省的析构函数。对大多数类来说,缺省的析构函数就能满足要求,如果在一个对象完成其操作之前还需要做一些内部处理,则应显式的定义析构函数。析构函数的定义格式如下:析构函数的定义格式如下::注意:析构函数仅能有一个,不能重载。注意:析构函数仅能有一个,不能重载。例7.3问题:构造函数和析构函数举例。#include class Tpointpublic:Tpoint(int m,int
12、 n)x=m;y=n;/定义构造函数定义构造函数Tpoint();int Getx()return x;int Gety()return y;private:int x,y;Tpoint:Tpoint()coutDestructor called.n;void main()Tpoint a(10,20);Tpoint b(15,25);couta.Getx(),a.Gety()endl;coutb.Getx(),b.Gety()endl;该程序的运行结果如下:该程序的运行结果如下:10,2015,25Destructor called.Destructor called.类的构造函数和析构函数
13、注意:类的构造函数在程序中为对象创建时分配系统资源提供了初始化的方法;析构函数为对象撤销时释放系统资源提供了方法。无论用户是否定义构造函数和析构函数,它们都默认存在。只要定义了新类,类的对象在创建和撤销时,构造函数和析构函数将会被调用。3.复制构造函数 已有变量可以初始化另一个变量:lint a=5;int b=a;l同样,已有对象也可以初始化另一个对象。复制构造函数是一种特殊的成员函数,其功能是用一个已经初始化过了的对象去初始化另一个新创建的对象。复制构造函数的定义格式如下::(&)l注意:它只有一个参数,是对某个对象的引用。例7.4问题:调用复制构造函数的例子。#include class
14、 Tpointpublic:Tpoint(int m,int n);/定义构造函数定义构造函数 Tpoint();/定义析构函数定义析构函数 Tpoint(Tpoint&r);/定义复制构造函数定义复制构造函数int Getx()return x;int Gety()return y;private:int x,y;Tpoint:Tpoint(int m,int n)coutCall constructor.n;x=m;y=n;Tpoint:Tpoint(Tpoint&r)coutCopy constructor.n;x=r.x;y=r.y;Tpoint:Tpoint()coutDestruc
15、tor called.n;例7.4问题:调用复制构造函数的例子。void main()Tpoint a(10,20);Tpoint b(15,25);Tpoint c(a);couta.Getx(),a.Gety()endl;coutb.Getx(),b.Gety()endl;coutc.Getx(),c.Gety()endl;该程序的运行结果为:该程序的运行结果为:Call constructor.Call constructor.Copy constructor.10,2015,2510,20Destructor called.Destructor called.Destructor ca
16、lled.7.3成员函数的特性 成员函数除了说明和定义之外,还有一些相关的特性:l内联函数和外联函数 l成员函数重载 l设置参数的缺省值 1.内联函数和外联函数类的成员函数可以分为内联函数和外联函数。l内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。l而说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现部分。两者的区别:l一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数则是在编译时,将调用表达式用内联函数体来替换。这样在使用时去掉了调用环节,提高运行速度。缺点:如果内联函数代码过大,则目标程序会加大。例7.5
17、问题:内联函数与外联函数实例。#include class Apublic:A(int m,int n)/内联函数,定义在类体内内联函数,定义在类体内x=m;y=n;int Getx()return x;/内联函数,定义在类体内内联函数,定义在类体内int Gety()return y;/内联函数,定义在类体内内联函数,定义在类体内int sumxy();/内联函数,定义在类体外,但进行了转化内联函数,定义在类体外,但进行了转化int area();/外联函数,定义在类体外外联函数,定义在类体外private:int x,y;inline int A:sumxy()/由外联函数转化为内联函数由
18、外联函数转化为内联函数return Getx()+Gety();int A:area()return Getx()*Gety();void main()A s(10,20);coutsum=s.sumxy(),area=s.area()endl;在使用内联函数时,应注意以下几点:在使用内联函数时,应注意以下几点:(1)在内联函数内不允许用循环语句和开关语句。)在内联函数内不允许用循环语句和开关语句。(2)内联函数的定义必须出现在内联函数第一次被调用之前。)内联函数的定义必须出现在内联函数第一次被调用之前。(3)内联函数无法进行递归调用。)内联函数无法进行递归调用。2.成员函数重载 在前面介绍的
19、成员函数中,除了析构函数不能重载外,其他的成员函数都可以进行重载。但重载必须满足以下条件之一:l参数个数不同。l参数类型不同。l当参数个数相同时,参数类型至少有一个不同。l仅有返回值不同的函数是不能重载的。例7.6问题:成员函数重载实例。#includeclass Bpublic:B(int a)x=a+1;y=a;B(int a,int b)x=a;y=b;int add();int add(int a);int add(int a,int b);int Getx()return x;int Gety()return y;private:int x,y;int B:add()return x
展开阅读全文