谭浩强版C程序设计.pptx
会计学1谭浩强版谭浩强版C程序设计程序设计在建立一个对象时,作某些初始化的工作如对数据成员赋初值。即在创建对象(分配内存时)进行数据成员的初始化,因为对象是实实在在的对象,不能无具体属性值。注意:类的数据成员是不能在声明类时初始化的。9.1 9.1 构造函数构造函数构造函数构造函数作用:作用:作用:作用:创建对象(分配内存创建对象(分配内存时)时进行数据成员的初时)时进行数据成员的初始化始化9.1.1 9.1.1 对象的初始化对象的初始化对象的初始化对象的初始化第1页/共89页如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。如class Timeclass Timepublic:/public:/声明为公用成员声明为公用成员 hour;hour;minute;minute;sec;sec;Time t1=14,56,30;/Time t1=14,56,30;/将将t1t1初始化为初始化为14:56:3014:56:30但是,一般数据成员是私有的,或者类中有private或protected的成员,就不能用这种方法初始化。如何实现?第2页/共89页C+提供了构造函数(constructor)来处理对象的初始化。qq构造函数是特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。qq构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。qq它不具有任何类型,不返回任何值。qq构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。9.1.2 9.1.2 构造函数的作用构造函数的作用构造函数的作用构造函数的作用第3页/共89页例9.1 在例8.3基础上定义构造成员函数。#include include using namespace std;using namespace std;class Timeclass Time public:public:Time()/Time()/定义构造成员函数,函数名与类名相同定义构造成员函数,函数名与类名相同 hour=0;/hour=0;/利用构造函数对对象中的数据利用构造函数对对象中的数据成员赋初值成员赋初值minute=0;minute=0;sec=0;sec=0;void set_time();/void set_time();/函数声明函数声明void show_time();/void show_time();/函数声明函数声明private:private:int hour;/int hour;/私有数据成员私有数据成员int minute;int minute;int sec;int sec;第4页/共89页void Timevoid Time set_time()/set_time()/定义成员函数,向数据成员赋值定义成员函数,向数据成员赋值 cinhour;cinhour;cinminute;cinminute;cinsec;cinsec;void Timevoid Time show_time()/show_time()/定义成员函数,输出数据成员的值定义成员函数,输出数据成员的值 couthour:minute:secendl;couthour:minute:secendl;int main()int main()Time t1;/Time t1;/建立对象建立对象t1t1,同时调用构造函数同时调用构造函数t1.Time()t1.Time()t1.set_time();/t1.set_time();/对对t1t1的数据成员赋值的数据成员赋值t1.show_time();/t1.show_time();/显示显示t1t1的数据成员的值的数据成员的值 Time t2;/Time t2;/建立对象建立对象t2t2,同时调用构造函数同时调用构造函数t2.Time()t2.Time()t2.show_time();/t2.show_time();/显示显示t2t2的数据成员的值的数据成员的值return 0;return 0;第5页/共89页程序运行的情况为:10 25 5410 25 54 (从键盘输入新值赋给从键盘输入新值赋给t1t1的数据成员的数据成员)10:25:54 (10:25:54 (输出输出t1t1的时、分、秒值的时、分、秒值)0:0:0 (0:0:0 (输出输出t2t2的时、分、秒值的时、分、秒值)也可以在类外定义构造函数:TimeTime Time()/Time()/要加上类名要加上类名TimeTime和域限定和域限定 符符“”hour=0;hour=0;minute=0;minute=0;sec=0;sec=0;第6页/共89页有关构造函数的使用,有以下说明:(1)在类对象进入其作用域时调用构造函数。(2)构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同之点。(3)构造函数不需用户调用,也不能被用户调用。(4)如果用户自己没有定义构造函数,则C+系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。第7页/共89页qq不带参数构造函数,这种方式使该类的每一个对象都得到同一组初值。qq带参数的构造函数,用户希望对不同的对象赋予不同的初值。构造函数首部的一般格式:构造函数名(类型 1 形参1,类型2 形参2,)实参是在定义对象时给出的。定义对象的一般格式为:类名 对象名(实参1,实参2,);9.1.3 9.1.3 带参数的构造函数带参数的构造函数带参数的构造函数带参数的构造函数第8页/共89页例例9.2 9.2 有两个长方柱,其长、宽、高分别为:有两个长方柱,其长、宽、高分别为:(1)12,20,25(1)12,20,25;(2)10,14,20(2)10,14,20。求它们的体积。编。求它们的体积。编一个基于对象的程序,在类中用带参数的构造函一个基于对象的程序,在类中用带参数的构造函数。数。#include include using namespace std;using namespace std;class Boxclass Boxpublic:public:Box(int,int,int);/Box(int,int,int);/声明带参数的构造函数声明带参数的构造函数int volume();/int volume();/声明计算体积的函数声明计算体积的函数 private:private:int height;int height;int width;int width;int length;int length;BoxBox Box(int h,int w,int len)/Box(int h,int w,int len)/在类外定义带参数的构造函数在类外定义带参数的构造函数 height=h;height=h;width=w;width=w;length=len;length=len;第9页/共89页int Boxint Box volume()/volume()/定义计算体积的函数定义计算体积的函数 return(height*width*length);return(height*width*length);int main()int main()Box box1(12,25,30);/Box box1(12,25,30);/建立对象建立对象box1box1,并指定并指定box1box1长、宽、高的值长、宽、高的值coutThe volume of box1 is box1.volume()endl;coutThe volume of box1 is box1.volume()endl;Box box2(15,30,21);/Box box2(15,30,21);/建立对象建立对象box2box2,并指定并指定box2box2长、宽、高的值长、宽、高的值coutThe volume of box2 is box2.volume()endl;coutThe volume of box2 is box2.volume()endl;return 0;return 0;程序运行结果如下:程序运行结果如下:The volume of box1 is 9000The volume of box1 is 9000The volume of box2 is 9450The volume of box2 is 9450注意注意:带参数的构造函数中的形参,带参数的构造函数中的形参,其对应的实其对应的实参在定义对象时给定。参在定义对象时给定。第10页/共89页C+还提供另一种初始化数据成员的方法参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。例如例9.2中定义构造函数可以改用以下形式:BoxBox Box(int h,int w,int len):height(h)Box(int h,int w,int len):height(h),width(w)width(w),length(len)length(len)这种写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。甚至可以直接在类体中(而不是在类外)定义构造函数。9.1.4 9.1.4 用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化用参数初始化表对数据成员初始化第11页/共89页qq在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。qq这些构造函数具有相同的名字,而参数的个数或参数的类型不相同。这称为构造函数的重载。在第4章第4.6节中所介绍的函数重载的知识也适用于构造函数。通过下面的例子可以了解怎样应用构造函数的重载。9.1.5 9.1.5 构造函数的重载构造函数的重载构造函数的重载构造函数的重载第12页/共89页例例9.3 9.3 在例在例9.29.2的基础上,定义两个构造函的基础上,定义两个构造函数,其中一个无参数,一个有参数。数,其中一个无参数,一个有参数。#include include using namespace std;using namespace std;class Boxclass Boxpublic:public:Box();/Box();/声明一个无参的构造函数声明一个无参的构造函数Box(int h,int w,int len):height(h),width(w),length(len)Box(int h,int w,int len):height(h),width(w),length(len)/声明一个有参的构造函数,用参数的初始化表对数据成员初始化声明一个有参的构造函数,用参数的初始化表对数据成员初始化int volume();int volume();private:private:int height;int height;int width;int width;int length;int length;BoxBox Box()/Box()/定义一个无参的构造函数定义一个无参的构造函数 height=10;height=10;width=10;width=10;length=10;length=10;第13页/共89页int Boxint Box volume()volume()return(height*width*length);return(height*width*length);int main()int main()Box box1;/Box box1;/建立对象建立对象box1,box1,不指定实参不指定实参coutThe volume of box1 is box1.volume()endl;coutThe volume of box1 is box1.volume()endl;Box box2(15,30,25);/Box box2(15,30,25);/建立对象建立对象box2,box2,指定指定3 3个个实参实参coutThe volume of box2 is box2.volume()endl;coutThe volume of box2 is box2.volume()endl;return 0;return 0;在本程序中定义了两个重载的构造函数,其实还可以定义其他重载构造函数。第14页/共89页说明:(1)调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor)。显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。(2)如果在建立对象时选用的是无参构造函数,应注意正确书写定义对象的语句。(3)尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。第15页/共89页构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。例9.4 将例9.3程序中的构造函数改用含默认值的参数,长、宽、高的默认值均为10。在例9.3程序的基础上改写如下:9.1.6 9.1.6 使用默认参数的构造函数使用默认参数的构造函数使用默认参数的构造函数使用默认参数的构造函数第16页/共89页#include include using namespace std;using namespace std;class Boxclass Boxpublic:public:Box(int h=10,int w=10,int len=10);/Box(int h=10,int w=10,int len=10);/在声明构造函数时在声明构造函数时指定默认参数指定默认参数int volume();int volume();private:private:int height;int height;int width;int width;int length;int length;BoxBox Box(int h,int w,int len)/Box(int h,int w,int len)/在定义函数时可以不指定默认参数在定义函数时可以不指定默认参数 height=h;height=h;width=w;width=w;length=len;length=len;第17页/共89页int Boxint Box volume()volume()return(height*width*length);return(height*width*length);int main()int main()Box box1;/Box box1;/没有给实参没有给实参 coutThe volume of box1 is box1.volume()endl;coutThe volume of box1 is box1.volume()endl;Box box2(15);/Box box2(15);/只给定一个实参只给定一个实参coutThe volume of box2 is box2.volume()endl;coutThe volume of box2 is box2.volume()endl;Box box3(15,30);/Box box3(15,30);/只给定只给定2 2个实参个实参coutThe volume of box3 is box3.volume()endl;coutThe volume of box3 is box3.volume()endl;Box box4(15,30,20);/Box box4(15,30,20);/给定给定3 3个实参个实参coutThe volume of box4 is box4.volume()endl;coutThe volume of box4 is box4.volume()endl;return 0;return 0;第18页/共89页析构函数(destructor)也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“”符号。在C+中“”是位取反运算符,从这点也可以想到:析构函数是与构造函数作用相反的函数。当对象的生命期结束时,会自动执行析构函数。如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。9.2 9.2 析构函数析构函数析构函数析构函数第19页/共89页static局部对象,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象的析构函数。如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。析构函数的作用:并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。程序设计者事先设计好析构函数,只要对象的生命期结束,程序就自动执行析构函数来完成这些工作。第20页/共89页析构函数不返回任何值,没有函数类型,也没有函数参数。因此它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数。qq析构函数的作用并不仅限于释放资源方面,它还可以输出有关的信息。一般情况下,类的设计者应当在声明类的同时定义析构函数,以指定如何完成“清理”的工作。如果用户没有定义析构函数,C+编译系统会自动生成一个析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作都不进行。想让析构函数完成任何工作,都必须在定义的析构函数中指定。第21页/共89页例例9.5 9.5 包含构造函数和析构函数的包含构造函数和析构函数的C+C+程序。程序。#includeinclude#include#includeusing namespace std;using namespace std;class Student /class Student /声明声明StudentStudent类类 public:public:student(int n,string nam,char s)/student(int n,string nam,char s)/定义构造函数定义构造函数 num=n;num=n;name=nam;name=nam;sex=s;sex=s;coutConstructor called.endl;/coutConstructor called.endl;/输出有关信息输出有关信息 Student()/Student()/定义析构函数定义析构函数 coutDestructor called.endl;/coutDestructor called.endl;/输出有关信息输出有关信息void display()/void display()/定义成员函数定义成员函数 coutnum:numendl;coutnum:numendl;coutname:nameendl;coutname:nameendl;coutsex:sexendlendl;coutsex:sexendlendl;第22页/共89页private:private:int num;int num;char name10;char name10;char sex;char sex;int main()int main()Student stud1(10010,Wang_li,f);/Student stud1(10010,Wang_li,f);/建立对象建立对象stud1stud1stud1.display();/stud1.display();/输出学生输出学生1 1的数据的数据 Student stud2(10011,Zhang_fun,m);/Student stud2(10011,Zhang_fun,m);/定义对象定义对象stud2stud2stud2.display();/stud2.display();/输出学生输出学生2 2的数据的数据return 0;return 0;第23页/共89页程序运行结果如下:Constructor called.(Constructor called.(执行执行stud1stud1的构造函数的构造函数)num:10010 (num:10010 (执行执行stud1stud1的的displaydisplay函数函数)name:Wang_liname:Wang_lisex:fsex:fConstructor called.(Constructor called.(执行执行stud2stud2的构造函数的构造函数)num:10011 (num:10011 (执行执行stud2stud2的的displaydisplay函数函数)name:Zhang_funname:Zhang_funsex:msex:mDestructor called.(Destructor called.(执行执行stud2stud2的析构函数的析构函数)Destructor called.(Destructor called.(执行执行stud1stud1的析构函数的析构函数)第24页/共89页在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。如图9.1示意。9.3 9.3 调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序第25页/共89页图9.1第26页/共89页但是,并不是在任何情况下都是按这一原则处理的。对象可以在不同的作用域中定义,可以有不同的存储类别。这些会影响调用构造函数和析构函数的时机。下面归纳一下什么时候调用构造函数和析构函数:(1)在全局范围中定义的对象它的构造函数在文件中的所有函数(包括main函数)执行之前调用。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。第27页/共89页(2)如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。(3)如果在函数中定义静态(static)局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,只在main函数结束或调用exit函数结束程序时,才调用析构函数。第28页/共89页数组也可以由对象组成(对象数组的每一个元素都是同类的对象)。例如一个班有50个学生,每个学生的属性包括姓名、性别、年龄、成绩等。如果为每一个学生建立一个对象,需要分别取50个对象名。用程序处理很不方便。这时可以定义一个“学生类”对象数组,每一个数组元素是一个“学生类”对象。例如 Student stud50;Student stud50;/假设已声明了假设已声明了StudentStudent类,定义类,定义studstud数组,有数组,有5050个元素个元素9.4 9.4 对象数组对象数组对象数组对象数组第29页/共89页在建立数组时,同样要调用构造函数。如果有50个元素,需要调用50次构造函数。如果构造函数有多个参数,则不能用在定义数组时直接提供所有实参的方法,因为一个数组有多个元素,对每个元素要提供多个实参,如果再考虑到构造函数有默认参数的情况,很容易造成实参与形参的对应关系不清晰,出现歧义性。第30页/共89页如果构造函数有多个参数,在定义对象数组时应当怎样实现初始化呢?在花括号中分别写出构造函数并指定实参。如果构造函数有3个参数,分别代表学号、年龄、成绩。则可以这样定义对象数组:Student Stud3=/Student Stud3=/定义对象数组定义对象数组Student(1001,18,87),/Student(1001,18,87),/调用第调用第1 1个元素的构造个元素的构造函数,为它提供函数,为它提供3 3个实参个实参Student(1002,19,76),/Student(1002,19,76),/调用第调用第2 2个元素的构造个元素的构造函数,为它提供函数,为它提供3 3个实参个实参Student(1003,18,72)/Student(1003,18,72)/调用第调用第3 3个元素的构造个元素的构造函数,为它提供函数,为它提供3 3个实参个实参;第31页/共89页在建立对象数组时,分别调用构造函数,对每个元素初始化。每一个元素的实参分别用括号包起来,对应构造函数的一组形参,不会混淆。例9.6 对象数组的使用方法。#include include using namespace std;using namespace std;class Boxclass Boxpublic:public:Box(int h=10,int w=12,int len=15):height(h),width(w),length(len)Box(int h=10,int w=12,int len=15):height(h),width(w),length(len)/声明有默认参数的构造函数,用参数初始化表对数据成声明有默认参数的构造函数,用参数初始化表对数据成员初始化员初始化int volume();int volume();private:private:int height;int height;int width;int width;第32页/共89页int length;int length;int Boxint Box volume()volume()return(height*width*length);return(height*width*length);int main()int main()Box a3=/Box a3=/定义对象数组定义对象数组Box(10,12,15),/Box(10,12,15),/调用构造函数调用构造函数BoxBox,提供第提供第1 1个元素的实个元素的实参参Box(15,18,20),/Box(15,18,20),/调用构造函数调用构造函数BoxBox,提供第提供第2 2个元素的实个元素的实参参Box(16,20,26)/Box(16,20,26)/调用构造函数调用构造函数BoxBox,提供第提供第3 3个元素的实个元素的实参参;coutvolume of a0 is a0.volume()endl;coutvolume of a0 is a0.volume()endl;coutvolume of a1 is a1.volume()endl;coutvolume of a1 is a1.volume()endl;coutvolume of a2 is a2.volume()endl;coutvolume of a2 is a2.volume()endl;第33页/共89页运行结果如下:volume of a0 is 1800volume of a0 is 1800volume of a1 is 5400volume of a1 is 5400volume of a2 is 8320volume of a2 is 8320第34页/共89页在建立对象时,编译系统会为每一个对象分配一在建立对象时,编译系统会为每一个对象分配一定的存储空间,以存放其成员。定的存储空间,以存放其成员。对象空间的起始对象空间的起始地址就是对象的指针地址就是对象的指针。可以定义一个指针变量,。可以定义一个指针变量,用来存放对象的指针。如果有一个类:用来存放对象的指针。如果有一个类:class Timeclass Timepublic:public:int hour;int hour;int minute;int minute;int sec;int sec;void get_time();void get_time();9.5 9.5 对象指针对象指针对象指针对象指针 9.5.1 9.5.1 指向对象的指针指向对象的指针指向对象的指针指向对象的指针第35页/共89页void Timevoid Time get_time()get_time()couthour:minute:secendl;couthour:minute:sechour ptpt-hour pt所指向的对象中的所指向的对象中的hourhour成员,即成员,即t1.hourt1.hour(*pt).get_time()(*pt).get_time()调用调用ptpt所指向的对象中的所指向的对象中的get_timeget_time函数,即函数,即t1.get_timet1.get_timept-get_time()pt-get_time()调用调用ptpt所指向的对象中的所指向的对象中的get_timeget_time函数,即函数,即t1.get_timet1.get_time第36页/共89页对象有地址,存放对象初始地址的指针变量就是指向对象的指针变量。对象中的成员也有地址,存放对象成员地址的指针变量就是指向对象成员的指针变量。9.5.2 9.5.2 指向对象成员的指针指向对象成员的指针指向对象成员的指针指向对象成员的指针第37页/共89页1.指向对象数据成员的指针定义指向对象数据成员的指针变量的方法和定义指向普通变量的指针变量方法相同。例如int*p1;/int*p1;/定义指向整型数据的指针变量定义指向整型数据的指针变量定义指向对象数据成员的指针变量的一般形式为数据类型名*指针变量名;如果Time类的数据成员hour为公用的整型数据,则可以在类外通过指向对象数据成员的指针变量访问对象数据成员hour。p1=&t1.hour;/p1=&t1.hour;/将对象将对象t1t1的数据成员的数据成员hourhour的地址赋给的地址赋给p1p1,p1p1指向指向t1.hourt1.hourcout*p1endl;cout*p1endl;/输出输出t1.hourt1.hour的值的值第38页/共89页例9.7 有关对象指针的使用方法。#include include using namespace std;using namespace std;class Timeclass Timepublic:public:Time(int,int,int);Time(int,int,int);int hour;int hour;int minute;int minute;int sec;int sec;void get_time();/void get_time();/声明公有成员函数声明公有成员函数;第39页/共89页TimeTime Time(int h,int m,int s)Time(int h,int m,int s)hour=h;hour=h;minute=m;minute=m;sec=s;sec=s;void Timevoid Time get_time()/get_time()/定义公有成员函数定义公有成员函数 couthour:minute:secendl;couthour:minute:secendl;int main()int main()Time t1(10,13,56);/Time t1(10,13,56);/定义定义TimeTime类对象类对象t1t1int*p1=&t1.hour;/int*p1=&t1.hour;/定义指向整型数据的指针变量定义指向整型数据的指针变量p1p1,并使并使p1p1指指向向t1.hourt1.hourcout*p1endl;/cout*p1get_time();/p2-get_time();/调用调用p2p2所指向对象所指向对象(即即t1)t1)的的get_timeget_time函函数数 第40页/共89页每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。但是,不同对象都调用同一个函数代码段。那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?9.5.3 9.5.3 this this 指针指针指针指针第41页/共89页在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。例如,当调用成员函数a.volume时,编译系统就把对象a的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向找到对象a的数据成员。例如volume函数要计算height*width*length的值,实际上是执行:(this-height)*(this-width)*(this-length)this-height)*(this-width)*(this-length)由于当前this指向a,因此相当于执行:(a.height)*(a.width)*(a.length)a.height)*(a.width)*(a.length)这就计算出长方体a的体积。第42页/共89页this指针是隐式使用的,它是作为参数被传递给成员函数的。本来,成员函数volume的定义如下:int Boxint Box volume()volume()return(height*width*length);return(height*width*length);C+把它处理为int Boxint Box volume(Box*this)volume(Box*this)return(this-height*this-width*this-length);return(this-height*this-width*this-length);即在成员函数的形参表列中增加一个this指针。在调用该成员函数时,实际上是用以下方式调用的:a.volume(&a);a.volume(&a);将对象a的地址传给形参this指针。然后按this的指向去引用其他成员。第43页/共89页需要说明:这些都是编译系统自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针。在需要时也可以显式地使用this指针。例如在Box类的volume函数中,下面两种表示方法都是合法的、相互等价的。return(height*width*length);/return(height*width*length);/隐含使用隐含使用thisthis指针指针return(this-height*this-width*this-length);/return(this-height*this-width*this-length);/显式使用显式使用thisthis指针指针 可以用*this表示被调用的成员函数所在的对象,*this就是this所指向的对象,即当前的对象。例如在成员函数a.volume()的函数体中,如果出现*this,它就是本对象a。上面的return语句也可写成 return(*this).height*(*this).width*(*this).length)return(*this).height*(*this).width*(*this).length);第44页/共89页注意*this两侧的括号不能省略,不能写成*this.height。所谓“调用对象a的成员函数f”,实际上是在调用成员函数f时使this指针指向对象a,从而访问对象a的成员。在使用“调用对象a的成员函数f”时,应当对它的含义有正确的理解。第45页/共89页有时人们希望在需要用到对象时才建立对象,在不需要用该对象时就撤销它,释放它所占的内存空间以供别的数据使用。这样可提高内存空间的