您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > C---第03章-详解对象(2013年10月22日)解析
面向对象程序设计C++——第3章详解对象2主要内容对象的存储对象指针对象引用共享数据的保护对象数组字符串对象对象成员3对象的存储当一个C++对象被创建时,有两件事会发生:为对象分配内存。调用构造函数来初始化内存。4对象的存储作为特殊的变量形式,对象在哪个位置被创建,以及创建时为对象分配不同的内存区域决定了对象的作用域和生存期。对象的作用域与生存期的概念来源于变量的作用域与生存期。5变量的作用域变量有效性的范围称为变量的作用域。变量的作用域是从空间角度,即变量在程序中定义的位置角度来分析的。归纳起来,变量有4种不同的作用域:函数作用域块作用域函数原型作用域文件作用域6函数作用域在函数内部定义的变量,其作用域是从定义的位置起到函数体的结束,在此函数外是不能使用该变量的。在一个函数内部定义的变量,或在一个块中定义的变量称为局部变量。不同的函数可以使用相同名字的局部变量,它们在内存中分属不同的存储区间。7块作用域用花括号括起来的一部分程序称为一个块。在块内说明的标识符,只能在该块内使用。具有块作用域的标识符在其作用域内,将屏蔽其作用块包含本块的同名标识符,即变量名相同,局部更优先。8intmain(){intx=10;{intx=20;coutxendl;}coutxendl;return0;}2010x10x20定义变量即是在内存中开辟区间块作用域9intx;voidcude(){x=x*x*x;}intmain(){x=5;cude();coutxendl;return0;}输出:125输出:5intx=5;x为0在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量不起作用。10全局变量的作用域称为文件作用域,即在整个文件中都是可以访问的。其缺省的作用范围是:从定义全局变量的位置开始到该源程序文件结束。文件作用域11p,q有效intp=1,q=5;floatf1(inta){intb,c;.....}charc1,c2;main(){intm,n;.....}a,b,c有效m,n有效c1,c2有效全局变量局部变量全局变量增加了函数间数据联系的渠道,在函数调用时可以得到多于一个的返回值。12在函数原型的参数表中说明的标识符所具有的作用域称为函数原型作用域,它从其说明处开始,到函数原型说明的结束处结束。floatfun(intx,floaty);//函数fun的原型说明由于所说明的标识符与该函数的定义及调用无关,所以,可以在函数原型说明中只作参数的类型说明,而省略参量名。floatfun(int,float);函数原型作用域13注意文件作用域是全局的,其他三者是局部的。从作用域角度,可以把变量分为全局变量和局部变量。14类体的区域称为类作用域。类的成员函数与数据成员,其作用域都是属于类的作用域,仅在该类的范围内有效。类类型的作用域:在函数定义之外定义的类,其类名的作用域为文件作用域;而在函数体内定义的类,其类名的作用域为块作用域。对象的作用域与变量作用域完全相同。全局对象、局部对象、局部静态对象等。类作用域、类类型的作用域和对象的作用域15classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){coutx‘\t’yendl;}}a3,a4;intmain(){Aa1,a2;classB{inti,j;public:voidSetij(intm,intn){i=m;j=n;}};Bb1,b2;a1.Setxy(2.0,5.0);b1.Setij(1,2);return0;}类A:文件作用域,在整个文件中有效类B:块作用域,在函数内有效。全局对象局部对象16变量的生存期生存期是指变量在内存中存在的时间长短。是从变量值存在的时间角度来分析的。生存期可以分为静态生存期和动态生存期。17静态生存期是指在程序运行期间,系统对变量分配固定的存储空间。动态生存期则是在程序运行期间,系统对变量动态地分配存储空间。若一个函数在程序中被调用两次,则每次分配的单元有可能不同。18生存期与存储区域密切相关。存储区分为三个部分:代码存储区,存放源代码;静态存储区,存放程序的全局数据和静态数据;动态存储区,包括栈区和堆区。包括以下数据:1)函数形参。在调用函数时给形参分配存储空间。2)函数中的自动变量(未加static声明的局部变量)。3)函数调用时的现场保护和返回地址等。4)用malloc()或new申请的内存中的数据。19外存内存程序代码区静态存储区动态存储区存放程序代码存放变量需要区分变量的存储类型20局部变量的存储方式自动变量(auto):默认,存储在动态区寄存器变量(register):在cpu内部存储静态局部变量(static):存储在静态区21局部变量的存储方式动态局部变量未被赋值时,其值为随机值。其作用域的函数或复合语句结束时,空间被程序收回。静态局部变量在静态区所占空间一直保留,直到程序运行结束。由于存储在静态区,静态局部变量或全局变量未赋初值时,系统自动使之为0。22intfun(inta){intc;staticintb=3;c=a+b++;returnc;}intmain(){intx=2,y;y=fun(x);coutyendl;y=fun(x+3);coutyendl;return0;}x2ya2b3c5455a5只赋一次初值c9599输出:变量b是静态局部变量,在内存一旦开辟空间,就不会释放,空间值一直保留23全局变量的存储方式全局变量是在函数的外部定义的,编译时分配在静态存储区,如果未赋初值,其值为0。extern存储类别全局变量的默认方式,当在一个文件中要引用另一个文件中的全局变量或在全局变量定义之前要引用它时,可用extern作说明,相当于扩大全局变量的作用域。静态(static)存储类别它仅能在本文件中引用,即使在其它文件中用extern说明也不能使用。相当于限制了全局变量的作用域范围。24全局变量的存储方式静态局部变量:static在函数内部定义,存储在静态存储区,与auto对应,在别的函数中不能引用。全局静态变量:static在函数外部定义,只限在本文件中使用,与extern对应。25动态存储分配堆允许程序在运行时(而不是在编译时)申请某个大小的内存空间。动态内存分配技术可以保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放。在堆中动态分配存储空间,可以采用指针和new运算符动态地分配内存,用delete运算符释放new申请的内存空间。26new运算符从堆中分配一块与类型相适应的存储空间,若分配成功,将这块内存空间的首地址存入指针,否则置指针的值为NULL(空指针值,即0)。delete操作符用来释放指针指向的动态存储空间。27【例3-3】指针的声明、赋值与使用。int*iptr;//声明int型指针iptrinti;iptr=&i;//取i的地址赋给iptri=100;coutOutputinti=iendl;//输出int型数的值coutOutputintpointeri=*iptrendl;//输出指针所指地址的内容Outputinti=100Outputintpointeri=10028new运算符new运算符的一般格式为:指针变量名=new类型;指针变量名=new类型(初值);指针变量名=new类型[元素个数];29delete运算符格式如下:delete指针变量名delete[]指针变量名其中,第2种格式用于释放指针指向的连续存储空间,即释放数组占用的空间。30【例3-4】用new获得动态存储空间。int*a=newint;//分配堆空间并将起始地址赋给指针a*a=76;//将76存入指针a指向的内存空间cout*aendl;//输出指针a指向的内存空间的值deletea;//释放a指向的动态存储空间31【例3-5】用new申请连续存储空间(即数组空间)。array=newint[arraysize];array[count]=count*2;delete[]array;32动态对象用new运算符创建堆对象的一般格式为:new类名;new类名(初值列表);33用delete运算符删除new建立的对象,释放指针所指向的内存空间。使用格式如下:delete指向对象的指针变量名;Student*pstu=newStudent;…deletepstu;34对象指针与基本数据类型的变量一样,每一个对象在创建之后都会在内存中占有一定的空间。因此,既可以通过对象名访问对象,也可以通过对象的起始地址来访问一个对象,即对象指针。35对象指针对象指针就是用于存放对象数据起始地址的变量。声明对象指针的一般格式为:类名*对象指针名;36对象指针的初始化一般格式为:数据类型*对象指针名=&对象名;对象指针名=&对象名;37void指针一般情况下,指针的值只能赋给相同类型的指针。但是void类型的指针,可以存储任何类型的对象地址,就是说任何类型的指针都可以赋值给void类型的指针变量。强制类型转换后,通过void类型的指针便可以访问任何类型的数据。38#includeiostreamusingnamespacestd;//voidv;//错误,不能声明void类型的变量void*vp;//正确,可以声明void类型的指针intmain(){int*ip;inti=10;vp=&i;//void类型指针指向整型变量//cout“*vp=”*vpendl;//错误,void型指针在使用前//必须确定类型ip=(int*)vp;//类型强制转换,void类型指针赋值给int类型指针cout*ip=*ipendl;return0;}39通过指针访问对象成员一般格式如下:对象指针名-公有成员boxp-volumn();(*对象指针名).公有成员(*boxp).volumn();40通过对象指针访问学生类的成员函数。Students1;//定义Student类的对象s1s1.input(001,ZhangHua,95);//通过s1访问公有成员函数s1.display();//通过对象访问公有成员函数Student*pstu=&s1;//定义Student类的对象指针pstu,并指向对象s1pstu-input(002,WangLi,90);//通过指针访问公有成员函数pstu-display();//通过指针访问公有成员函数(*pstu).modify(85);(*pstu).display();41【例3-11】定义一个Box类,要求动态地建立并释放对象。intmain(){Box*pbox1=newBox;//定义指向Box堆对象的指针变量pbox1coutThevolumeofbox1ispbox1-volume()endl;deletepbox1;//释放pbox1指向的对象空间Box*pbox2=newBox(15,30,25);//定义指向Box堆对象的指针变量pbox2,//在pbox2中存放堆对象的起始地址并初始化堆对象coutThevolumeofbox2ispbox2-volume()endl;//指针访问成员deletepbox2;//释放pbox2指向的对象空间return0;}42【例3-13】对象指针做函数参数。#includeiostreamusingnamespacestd;classCStrtemp{public:CStrtemp(
本文标题:C---第03章-详解对象(2013年10月22日)解析
链接地址:https://www.777doc.com/doc-4841095 .html