C++程序设计-cchp9怎样使用类和对象.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++程序设计-cchp9怎样使用类和对象.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 cchp9 怎样 使用 对象
- 资源描述:
-
1、第9章 怎样使用类和对象9.1 利用构造函数对类对象进行初始化9.2 析构函数9.3 调用构造函数和析构函数的顺序9.4 对象数组9.5 对象指针9.6 共用数据的保护9.7 对象的动态建立和释放9.8 对象的赋值和复制9.9 静态成员9.10 友元9.11 类模板9.1 利用构造函数对类对象进行初始化9.1.1 对象的初始化对象的初始化 在建立一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。如果一个数据成员未被赋值,则它的值是不可预知的。注意:类的数据成员是不能在声明类时初始化的。class Timepublic:/声明为公用成员 hour=0;/错:类的数据成员不能在定义时初
2、始化 minute=0;/错:类的数据成员不能在定义时初始化 sec=0;/错:类的数据成员不能在定义时初始化;如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如class Timepublic:/声明为公用成员 hour;minute;sec;Time t1=14,56,30;/将t1初始化为14:56:30但是,如果数据成员是私有的,或者类中有但是,如果数据成员是私有的,或者类中有private或或protected的成员,就不能用这种方法初始化。的成员,就不能用这种方法初始化。struct Student /结构声明 int num;char name20;fl
3、oat score;;Student stu1=1001,“zhang san”,89;/对对 定义结构体变量时同时初始化对结构体,其成员默认是publicstruct Student /结构声明 private:int num;char name20;float score;;Student stu1=1001,“zhang san”,89;/错错 错:不能对私有成员初始化Student类class Student /类声明private:int num;char name20;float score;public:void display()coutnum:numendl;coutname
4、:nameendl;coutscore:scoreendl;p数据成员是私有的,本类外不能直接访问Student stu1=1001,”zhang san”,89;/定义对象并初始化?定义对象并初始化?不能不能!C+提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行建立对象时自动执行。构造函数的名字必须与类名构造函数的名字必须与类名同名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。它不具有任
5、何类型,不返回任何值。构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。9.1.2 构造函数的作用创建Student类的构造函数#include using namespace std;class Student private:int num;char name20;float score;public:Student(int n,char*p,float s);/构造函数的声明构造函数的声明 void display();Student:Student(int n,char*p,float s)/构造函数的定义构造函数的定义num=n;strcpy(name,p);s
6、core=s;创建Student类的构造函数void Student:display()coutdisplay:endl;coutnum:numendl;coutname:nameendl;coutscore:scoreendl;int main()Student stu1(1001,zhang san,89);stu1.display();return 0;在建立对象在建立对象stu1时,系统时,系统自动调自动调用用构造函数一次构造函数一次:Student(1001,zhang san,89)将初始值存储到对象将初始值存储到对象stu1中。中。#include using namespace
7、 std;class Student private:int num;char name20;float score;public:Student(int n,char*p,float s);/构造函数的声明构造函数的声明 void display();Student:Student(int n,char*p,float s)/构造函数的定义构造函数的定义num=n;strcpy(name,p);score=s;构造函数代码与input()函数相同input(int n,char*p,float s);/输入函数的声明输入函数的声明Student:input(int n,char*p,floa
8、t s)/输入函数的定义输入函数的定义void Student:display()coutdisplay:endl;coutnum:numendl;coutname:nameendl;coutscore:scoreendl;int main()Student stu1;stu1.input(1001,zhang san,89);stu1.display();return 0;构造函数代码与input()函数相同要调用对象要调用对象stu1的成员函数的成员函数input()(),通过它输入相关的通过它输入相关的数据。数据。o特殊的类成员函数;o与类名同名;o虽然没有返回值,但没有被声明为void
9、类型。实际上,构造函数没有声明类型;o在建立对象时自动调用执行;oC+为构造函数提供了名称和使用句法,程序员则根据初始化的要求设计函数体和函数参数。构造函数特性 例9.1 在例8.3基础上定义构造成员函数。#include using namespace std;class Time public:Time()/定义构造成员函数,函数名与类名相同 hour=0;/利用构造函数对对象中的数据成员赋初值 minute=0;sec=0;void set_time();/函数声明 void show_time();/函数声明private:int hour;/私有数据成员 int minute;int
10、 sec;void Time set_time()/定义成员函数,向数据成员赋值 cinhour;cinminute;cinsec;void Time show_time()/定义成员函数,输出数据成员的值 couthour:minute:secendl;int main()Time t1;/建立对象t1,同时调用构造函数t1.Time()t1.set_time();/对t1的数据成员赋值t1.show_time();/显示t1的数据成员的值 Time t2;/建立对象t2,同时调用构造函数t2.Time()t2.show_time();/显示t2的数据成员的值return 0;程序运行的情况
11、为:程序运行的情况为:10 25 54 (从键盘输入新值赋给从键盘输入新值赋给t1的数据成员的数据成员)10:25:54 (输出输出t1的时、分、秒值的时、分、秒值)0:0:0 (输出输出t2的时、分、秒值的时、分、秒值)也可以只在类内对构造函数进行声明而在类外定义构造函数。也可以只在类内对构造函数进行声明而在类外定义构造函数。class Time public:Time()hour=0;minute=0;sec=0;void set_time();void show_time();private:int hour;int minute;int sec;class Time public:Ti
12、me();void set_time();void show_time();private:int hour;int minute;int sec;Time:Time()hour=0;minute=0;sec=0;在例9.1中构造函数不带参数,在函数体中对数据成员赋初值。这种方式使该类的每一个对象都得到同一组初值(例如例9.1中各数据成员的初值均为0)。但是有时用户希望对不同的对象赋予不同的初值。可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。构造函数首部的一般格式为 构造函数名(类型1 形参1,类型2 形参2,)前面已说明:用户是不
13、能调用构造函数的,因此无法采用常规的调用函数的方法给出实参。实参是在定义对象时给出的。定义对象的一般格式为 类名 对象名(实参1,实参2,);9.1.3 带参数的构造函数 有两个长方柱,其长、宽、高分别为:有两个长方柱,其长、宽、高分别为:(1)12,20,25(1)12,20,25;(2)10,14,20(2)10,14,20。求它们的体积。编一个基于对象的程序,在类。求它们的体积。编一个基于对象的程序,在类中用带参数的构造函数。中用带参数的构造函数。#include using namespace std;class Box public:Box(int,int,int);/声明带参数的构
14、造函数声明带参数的构造函数 int volume();/声明计算体积的成员函数声明计算体积的成员函数 private:int height;int width;int length;Box Box(int h,int w,int len)/在类外定义带参数的构造函数在类外定义带参数的构造函数 height=h;width=w;length=len;/例例9.29.2int Box volume()/定义计算体积的成员函数定义计算体积的成员函数 return(height*width*length);int main()Box box1(12,25,30);/建立对象建立对象box1,并指定并指
15、定box1长、宽、高的值长、宽、高的值 coutThe volume of box1 is box1.volume()endl;Box box2(15,30,21);/建立对象建立对象box2,并指定并指定box2长、宽、高的值长、宽、高的值 coutThe volume of box2 is box2.volume()endl;return 0;程序运行结果如下:The volume of box1 is 9000The volume of box2 is 9450/例例9.29.2在9.1.3节中介绍的是在构造函数的函数体内通过赋值语句对数据成员实现初始化。C+还提供另一种初始化数据成员的
16、方法参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例如例9.2中定义构造函数可以改用以下形式:Box Box(int h,int w,int len):height(h),width(w),length(len)类名:构造函数名(参数表):成员初始化表 构造函数体 这种写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。甚至可以直接在类体中(而不是在类外)定义构造函数。9.1.4 用参数初始化表对数据成员初始化class Box public:Box(int,int,int);int volume();private:int heig
17、ht;int width;int length;Box Box(int h,int w,int len)height=h;width=w;length=len;赋值语句对数据成员实现初始化class Box public:Box(int,int,int);int volume();private:int height;int width;int length;Box Box(int h,int w,int len):height(h),width(w),length(len)参数初始化表实现对数据成员的初始化在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构
18、造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。在第4章第4.8节中所介绍的函数重载的知识也适用于构造函数。9.1.5 构造函数的重载例9.3 在例9.2的基础上,定义两个构造函数,其中一个无参数,一个有参数。#include using namespace std;class Boxpublic:Box();/声明一个无参的构造函数 Box(int h,int w,int len):height(h),width(w),length(len);/声明一个有参的构造函数,用参数的初始化表对数据成员初始化 int volume();private:int height
19、;int width;int length;Box Box()/定义一个无参的构造函数 height=10;width=10;length=10;int Box volume()return(height*width*length);int main()Box box1;/建立对象建立对象box1,不指定实参不指定实参coutThe volume of box1 is box1.volume()endl;Box box2(15,30,25);/建立对象建立对象box2,指定指定3个实参个实参coutThe volume of box2 is box2.volume()endl;return 0
20、;说明:(1)在建立对象时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。(2)如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句:类名 对象名;(3)尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。在第4章第4.10节中介绍过在函数中可以使用有默认值的参数。在构造函数中也可以采用这样的方法来实
21、现初始化。9.1.6 使用默认参数的构造函数例9.4 将例9.3程序中的构造函数改用含默认值的参数,长、宽、高的默认值均为10#include using namespace std;class Boxpublic:Box(int h=10,int w=10,int len=10);/在声明构造函数时指定默认参数 int volume();private:int height;int width;int length;Box Box(int h,int w,int len)/在定义函数时可以不指定默认参数height=h;width=w;length=len;int Box volume()r
22、eturn(height*width*length);int main()Box box1;/没有给实参 coutThe volume of box1 is box1.volume()endl;Box box2(15);/只给定一个实参 coutThe volume of box2 is box2.volume()endl;Box box3(15,30);/只给定2个实参 coutThe volume of box3 is box3.volume()endl;Box box4(15,30,20);/给定3个实参 coutThe volume of box4 is box4.volume()en
23、dl;return 0;o当对象的生命期结束时,会自动执行析构函数。o每个类只能有一个析构函数;o析构函数没有返回类型(连void也没有),也没有参数;o其名称为类名称前加上Student();/Student类析构函数o析构函数的任务由程序设计者安排。如:完成清理工作,释放内存等。9.2 析构函数class Studentprivate:int num;char name20;float score;public:Student(int n,char*p,float s);/构造函数声明构造函数声明 Student(););/析构函数声明析构函数声明 void display()coutnd
24、isplay:nnum:numendl;coutname:nameendl;coutscore:scoreendl;int main()Student stu1(1001,zhang san,89);stu1.display();return 0;/当函数结束前,要释放对象当函数结束前,要释放对象stu1的空间,此时自动调用的空间,此时自动调用 StudentStudent:Student(int n,char*p,float s)/构造函数定义构造函数定义num=n;strcpy(name,p);score=s;Student:Student()/析构函数定义析构函数定义 cout“结束结束
25、”;例:例:class AA AA()/构造函数构造函数 AA()/析构函数析构函数 ;void test()int x,y;AA t1,t2;return;构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;构造函数构造函数 构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;析构函数析构函数 构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/声明变量
展开阅读全文