ImageVerifierCode 换一换
格式:PPT , 页数:69 ,大小:483.50KB ,
文档编号:3376726      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3376726.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(C++程序设计-cchp9怎样使用类和对象.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

C++程序设计-cchp9怎样使用类和对象.ppt

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;/声明变量

26、时开辟两个整型存储空间声明变量时开辟两个整型存储空间 构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/创建创建2个对象个对象,两次调用构造函数两次调用构造函数 构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/创建创建2个对象个对象,两次调用构造函数两次调用构造函数 构造函数和析构函数例:例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/两次调用析构函数,撤消对象两

27、次调用析构函数,撤消对象 构造函数和析构函数例:例: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;/两次调用析构函数,撤消对象两次调用析构函数,撤消对象/变量变量 x,y 生存期结束生存期结束 构造函数和析构函数有两个长方柱,其长、宽、高分别为:有两个长方柱,其长、宽、高分别为:(1)12,20,25(1)12,20,25;(2)10,14,20(2

28、)10,14,20。求它们的体积。编一个基于对象的程序,在类。求它们的体积。编一个基于对象的程序,在类中用带参数的构造函数。中用带参数的构造函数。#include include using namespace std;using namespace std;class Boxclass Boxpublic:public:Box(int,int,intBox(int,int,int););/声明带参数的构造函数声明带参数的构造函数 Box();Box();/没有函数类型没有函数类型,没有参数没有参数 intint volume();volume();/声明计算体积的成员函数声明计算体积的成员函

29、数 private:private:intint height;height;intint width;width;intint length;length;BoxBox(intBoxBox(int h,inth,int w,intw,int lenlen)/在类外定义带参数的构造函数在类外定义带参数的构造函数 height=h;height=h;width=w;width=w;length=length=lenlen;coutcout“构造函数被调用构造函数被调用”endlendl;Box:BoxBox:Box()()coutcout “析构函数被自动调用析构函数被自动调用”endlendl

30、;intint Boxvolume()Boxvolume()/定义计算体积的成员函数定义计算体积的成员函数 return(heightreturn(height*widthwidth*length);length);intint main()main()Box box1(12,25,30);Box box1(12,25,30);/建立对象建立对象box1box1,并指定并指定box1box1长、宽、高的值长、宽、高的值coutcoutThe volume of box1 is box1.volume()The volume of box1 is box1.volume()endlendl;Bo

31、x box2(15,30,21);Box box2(15,30,21);/建立对象建立对象box2box2,并指定并指定box2box2长、宽、高的值长、宽、高的值coutcoutThe volume of box2 is box2.volume()The volume of box2 is box2.volume()endlendl;return 0;return 0;/结束时结束时,自动调用析构函数自动调用析构函数 显示显示:构造函数被调用构造函数被调用 The volume of box1 is 9000 构造函数被调用构造函数被调用 The volume of box2 is 9450

32、 析构函数被调用析构函数被调用 析构函数被调用析构函数被调用9.3 调用构造函数和析构函数的顺序 在使用构造函数和析构函数时,需要特别注意在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:用构造函数的次序相反:最先被调用的构造函数,最先被调用的构造函数,其对应的其对应的(同一对象中的同一对象中的)析构函数最后被调用,而析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被最后被调用的构造函数,其对应的析构函数最先被调用。如图调用。如图9

33、.1示意。示意。图9.19.3 调用构造函数和析构函数的顺序main()Box box1(1,2,3);Box box2(2,5,3);Box box3(1,1,1);return;box1的构造函数被调用Box2的构造函数被调用Box3的构造函数被调用Box3的析构函数被调用Box2的析构函数被调用Box1的析构函数被调用 但是,并不是在任何情况下都是按这一原则处理但是,并不是在任何情况下都是按这一原则处理的。在第的。在第4章第章第4.11和和4.12节中曾介绍过节中曾介绍过作用域作用域和和存储存储类别类别的概念,这些概念对于对象也是适用的。的概念,这些概念对于对象也是适用的。对象可对象可以

34、在不同的作用域中定义,可以有不同的存储类别。以在不同的作用域中定义,可以有不同的存储类别。这些会影响调用构造函数和析构函数的时机。这些会影响调用构造函数和析构函数的时机。下面归纳一下什么时候调用构造函数和析构函数:下面归纳一下什么时候调用构造函数和析构函数:(1)在全局范围中定义的对象在全局范围中定义的对象(即在所有函数之外定义即在所有函数之外定义的对象的对象),它的构造函数在文件中的所有函数,它的构造函数在文件中的所有函数(包括包括main函数函数)执行之前调用。但如果一个程序中有多个执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对文件,而不同的文件中都定义

35、了全局对象,则这些对象的构造函数的执行顺序是不确定的。当象的构造函数的执行顺序是不确定的。当main函数执函数执行完毕或调用行完毕或调用exit函数时函数时(此时程序终止此时程序终止),调用析构函,调用析构函数。数。Box box1(1,2,3);main()Box box2(2,5,3);Box box3(1,1,1);return;全局对象box1的构造函数被调用局部自动对象Box2的构造函数被调用局部对象Box3的构造函数被调用Box3的析构函数被调用Box2的析构函数被调用Box1的析构函数被调用(2)如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果

36、函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。(3)如果在函数中定义静态(static)局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。9.4 对象数组 数组不仅可以由简单变量组成(例如整型数组的每一个元素都是整型变量),也可以由对象组成(对象数组的每一个元素都是同类的对象)。对于已经定义的类Student:Student stu3;/stu是对象数组 在建立数组时,同样要调用构造函数。如果有3个元素,自动调用3次构造

37、函数。若定义数组时要初始化,只能用构造函数:Student stu3=Student(1001,18,87),Student(1002,19,90),Student(1001,17,85);如果如果构造函数只有一个参数构造函数只有一个参数,在定义数组时可以直接在,在定义数组时可以直接在等号后面的花括号内提供实参。如等号后面的花括号内提供实参。如Student:Student(int no);Student stud3=60,70,78;/合法,合法,3个实参分别传递个实参分别传递 /给给3个数组元素的构造函数个数组元素的构造函数当然,也可以:当然,也可以:Student stud3=Stude

38、nt(60),Student(70),Student(78);如果如果构造函数有多个参数构造函数有多个参数,则不能用在定义数组时直接提供,则不能用在定义数组时直接提供所有实参的方法所有实参的方法,要用构造函数要用构造函数Student:Student(int no,int s1,int s2);Student stu3=Student(1001,18,87),Student(1002,19,90),Student(1001,17,85);有有3 3个长方柱,其长、宽、高分别为:个长方柱,其长、宽、高分别为:(1)(1)3,2,13,2,1;(2)(2)6,4,56,4,5;(;(3 3)2,2

39、,22,2,2。求它们的体积。编一个基于对象的程序,在类中用带参数。求它们的体积。编一个基于对象的程序,在类中用带参数的构造函数。的构造函数。#include using namespace std;class Boxpublic:Box(int,int,int);/声明带参数的构造函数声明带参数的构造函数 int volume();/声明计算体积的成员函数声明计算体积的成员函数 private:int height;int width;int length;Box Box(int h,int w,int len)/在类外定义带参数的构造函数在类外定义带参数的构造函数 height=h;wid

40、th=w;length=len;int Box volume()/定义计算体积的成员函数定义计算体积的成员函数return(height*width*length);int main()Box a3=Box(3,2,1),/用构造函数初始化用构造函数初始化box0 Box(6,5,4),/用构造函数初始化用构造函数初始化box1 Box(2,2,2)/用构造函数初始化用构造函数初始化box2 ;int i;for (i=0;i3;i+)coutThe volume of box”i+1“is ai.volume()endl;return 0;/结束时结束时,自动调用析构函数自动调用析构函数习题

41、9.5 建立对象数组,内放5个学生数据(学号,成绩),设立一个函数max,用指向对象的指针作为函数参数,在max函数中找出成绩最高者,输出其学号。#include iostreamusing namespace std;class Student private:int num;float score;public:Student(int nu,float sco):num(nu),score(sco);void display();friend void max(Student*,int);/友元函数声明;void Student:display()cout学号:num 分数:scoreen

42、dl;void max(Student*ps,int n)int i,k;k=0;for(i=1;in;i+)if(*(ps+k).score(*(ps+i).score)k=i;cout成绩最高者的学号:(*(ps+k).numendl;int main()Student stu5=Student(1001,75),Student(1002,78),Student(1003,95),Student(1004,60),Student(1005,62);int i;for(i=0;inum stu.name 相当于(*p).name p-name stu.display()相当于 p-displ

43、ay()9.5.2 指向对象成员的指针指向对象成员的指针 对象有地址,存放对象初始地址的指针变量就是指向对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象的指针变量。对象中的成员也有地址,存放对象成员对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量地址的指针变量就是指向对象成员的指针变量。class Timepublic:int hour;int minute;int sec;void get_time();Time t;对象对象t有存储地址;有存储地址;t中的成员中的成员t.hour,t.minute,t.sec也有也有存储地址。可定义指针变量指向这

44、些成员。存储地址。可定义指针变量指向这些成员。1.指向对象数据成员的指针指向对象数据成员的指针定义指向对象数据成员的指针变量的方法和定义指向普通定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。例如变量的指针变量方法相同。例如Time t;Time *p;/定义指向对象的指针变量定义指向对象的指针变量int*p1;/定义指向整型数据的指针变量定义指向整型数据的指针变量p=&t;/p指向了对象指向了对象tp1=&t1.hour;/p1指向了对象中的成员指向了对象中的成员hour /*p1 就是就是 t.hour 2.指向对象成员函数的指针指向对象成员函数的指针 定义指向对

45、象成员函数的指针变量的方法和定义指向普定义指向对象成员函数的指针变量的方法和定义指向普通函数的指针变量方法有所不同。通函数的指针变量方法有所不同。成员函数与普通函数有一个最根本的区别:成员函数与普通函数有一个最根本的区别:它是类中它是类中的一个成员。编译系统要求在上面的赋值语句中,指针变量的一个成员。编译系统要求在上面的赋值语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配,要求在以下的类型必须与赋值号右侧函数的类型相匹配,要求在以下3方面都要匹配:方面都要匹配:函数参数的类型和参数个数;函数返函数参数的类型和参数个数;函数返回值的类型;所属的类。回值的类型;所属的类。定义指向成员函数的指

46、针变量应该采用下面的形式:定义指向成员函数的指针变量应该采用下面的形式:void(Time *p2)();/定义定义p2为指向为指向Time类中公用成类中公用成 /员函数的指针变量员函数的指针变量定义指向公用成员函数的指针变量的一般形式为定义指向公用成员函数的指针变量的一般形式为 数据类型名数据类型名(类名类名 *指针变量名指针变量名)(参数表列参数表列);可以让指针变量可以让指针变量p2指向一个公用成员函数,只需把公用指向一个公用成员函数,只需把公用成员函数的入口地址赋给成员函数的入口地址赋给p2即可。如即可。如 p2=&Time get_time;使指针变量指向一个公用成员函数的一般形式为

47、使指针变量指向一个公用成员函数的一般形式为 指针变量名指针变量名=&类名类名 成员函数名成员函数名;例例9.7 有关对象指针的使用方法。有关对象指针的使用方法。#include using namespace std;class Time public:Time(int,int,int);int hour;int minute;int sec;void get_time();/声明公有成员函数声明公有成员函数;Time Time(int h,int m,int s)hour=h;minute=m;sec=s;void Time get_time()/定义公有成员函数定义公有成员函数 couth

48、our:minute:secendl;int main()Time t1(10,13,56);/定义定义Time类对象类对象t1 int*p1=&t1.hour;/定义指向整型数据的指针变量定义指向整型数据的指针变量 /p1,并使并使p1指向指向t1.hourcout*p1get_time();/调用调用p2所指向对象所指向对象(即即t1)的的 /get_time函数函数void(Time *p3)();/定义指向定义指向Time类公用成员函数类公用成员函数 /的指针变量的指针变量p3p3=&Time get_time;/使使p3指向指向Time类公用成员函数类公用成员函数 /get_time

49、(t1.*p3)();/调用对象调用对象t1中中p3所指的成员函数所指的成员函数 /(即即t1.get_time()程序运行结果为程序运行结果为10 (main函数第函数第4行的输出行的输出)10:13:56 (main函数第函数第5行的输出行的输出)10:13:56 (main函数第函数第7行的输出行的输出)10:13:56 (main函数第函数第10行的输出行的输出)this指针 在类的每个成员函数中,都内含一个系统定义好的特殊指针,名字是this,它总是指向当前被调用的成员函数所在的对象。例如,当调用成员函数a.volume()时,编译系统就把对象a的起始地址赋给this指针,于是在成员

50、函数引用数据成员时,就按照this的指向找到对象a的数据成员。例如volume函数要计算height*width*length的值,实际上是执行:(this-height)*(this-width)*(this-length)由于当前this指向a,因此相当于执行:(a.height)*(a.width)*(a.length)这就计算出长方体a的体积。同样如果有b.volume(),编译系统就把对象b的起始地址赋给成员函数volume的this指针,显然计算出来的是长方体b的体积。this指针是隐式使用的,它是作为参数被传递给成员函数的。指针是隐式使用的,它是作为参数被传递给成员函数的。本来,

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|