第二讲复杂的对象.ppt
OOPC+第二讲第二讲复杂的对象复杂的对象1OOPC+本讲主要内容本讲主要内容l类和对象类和对象l对象数组和对象指针对象数组和对象指针lthis指针指针2OOPC+1.类和对象类和对象l在面向对象程序设计中,对象的类型称为类(在面向对象程序设计中,对象的类型称为类(class)。)。l类代表了某一批对象的共性和特征。类代表了某一批对象的共性和特征。l类是对象的抽象。类是对象的抽象。l而对象是类的具体实例(而对象是类的具体实例(instance)。)。vclassprivate:protected:public:;v对象的定义对象的定义类类型类类型对象对象1,对象,对象2,3OOPC+类设计类设计?例题例题1定义一个类,实现输入定义一个类,实现输入10个整数,并能够反序输出。个整数,并能够反序输出。classmyclaprivate:intarr10;public:voidinput()for(inti=0;iarri;voidpr()for(inti=9;i=0;i-)coutarrixy;voidcopy(cla*p)x=p-x;y=p-y;voidpr()coutxyendl;参参考考答答案案10OOPC+写出以下程序段的输出结果写出以下程序段的输出结果#include#includeclasspersonprivate:intno;charname20;public:voidsetvalue(intno,charname)this-no=no;strcpy(this-name,name);intgetno()returnno;char*getname()returnname;voidmain()person*p;p=newperson;p-setvalue(1,zhang);coutgetno():(*p).getname()print();成员函数成员函数print()是怎样分清给哪个对象执行的呢?是怎样分清给哪个对象执行的呢?16OOPC+thislC+为成员函数提供一个称为为成员函数提供一个称为this的指针,的指针,this在所有成员函在所有成员函数调用里作为一个隐含参数传送给成员函数,所以,我们常数调用里作为一个隐含参数传送给成员函数,所以,我们常称成员函数拥有称成员函数拥有this指针。指针。l当一个对象调用类的成员函数时,当一个对象调用类的成员函数时,this指针就指向该对象,指针就指向该对象,this是一个隐含的指针,它不能被显式说明;是一个隐含的指针,它不能被显式说明;this是个局部变是个局部变量,局限于某一个对象。量,局限于某一个对象。lthis指针通常不显式使用,需要时可以用(指针通常不显式使用,需要时可以用(*this)来表示给)来表示给成员对象。成员对象。lthis指针主要在运算符重载、自引用等场合。指针主要在运算符重载、自引用等场合。l当一个对象调用类的成员函数时,系统先将该对象的地址赋当一个对象调用类的成员函数时,系统先将该对象的地址赋给给this指针,然后调用成员函数。指针,然后调用成员函数。17OOPC+lthis指针只能在一个类的成员函数中调用,它表示当前对象的指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:地址。下面是一个例子:voidDate:setMonth(intmn)month=mn;/这三句是等价的这三句是等价的this-month=mn;(*this).month=mn;18OOPC+l例如:类例如:类cla中有一个成员函数中有一个成员函数intcla:fun()()returnx*y;lC+把它处理为把它处理为intcla:fun(cla*this)returnthis-x*this-y;l当对象当对象obj调用该成员函数时,实际上是用下面的方式调用的调用该成员函数时,实际上是用下面的方式调用的obj.fun(&obj);将对象将对象obj的地址传给形的地址传给形this指针,然后按指针,然后按this的指向去引用的指向去引用成员函数的。成员函数的。注意:注意:this指针通常不显式定义!下面的语句不能出现在指针通常不显式定义!下面的语句不能出现在程序中,这里是为了便于理解。程序中,这里是为了便于理解。intcla:fun(cla*this)obj.fun(&obj);19OOPC+this指针练习指针练习(j205.cpp)l看程序,写结果。看程序,写结果。#includeclassaaprivate:inta,b;public:voidsetaa()a=0;b=0;voidsetaa1(intx,inty)a=x;b=y;intreturna()returna;intreturnb()returnb;voidmain()aaa1,a2;a1.setaa();a2.setaa1(3,4);a1.copy(a2);couta1.returna()-a2.returna()endl;couta1.returnb()+a2.returnb()endl;voidcopy(aa&z);voidaa:copy(aa&z)if(this=&z)return;*this=z;0 820OOPC+j206.cpp?例题例题5利用利用this指针,判断两个对象是否指针同一内存空间。指针,判断两个对象是否指针同一内存空间。class clapublic:int fun1(cla&obj)if(this=&obj)return 1;elsereturn 0;21OOPC+练习练习l1.1.关于关于thisthis指针的说法正确的是(指针的说法正确的是()。(A)(A)thisthis指针指针必须显示的说明必须显示的说明 (B)(B)定义一个类后,定义一个类后,thisthis指针就指向该类指针就指向该类 (C)(C)成员函数拥有成员函数拥有thisthis指针指针 (D)this(D)this指针属于对象的指针属于对象的u答案:答案:Cl2.this2.this指针能出现在(指针能出现在()地方。)地方。(A A)成员函数内部成员函数内部 (B B)成员函数形式参数成员函数形式参数 (C C)成员函数实际参数成员函数实际参数 (D D)普通函数参数普通函数参数u答案:答案:A22OOPC+对象的练习对象的练习l编程实现点的坐标,能够移动坐标点的位置,并将二维点坐编程实现点的坐标,能够移动坐标点的位置,并将二维点坐标的定义放在标的定义放在Tpoint.h中。(中。(Tpoint.h与与j207.cpp)23OOPC+本讲小结本讲小结l对象的数组和指针对象的数组和指针lthis 指针指针&作业:作业:1.设计一个学生类,设计方法实现对象之间的拷贝。设计一个学生类,设计方法实现对象之间的拷贝。2.用对象数组的指针,实现对象的输出功能。用对象数组的指针,实现对象的输出功能。24