对象数组与对象指针.docx_第1页
对象数组与对象指针.docx_第2页
对象数组与对象指针.docx_第3页
对象数组与对象指针.docx_第4页
对象数组与对象指针.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆邮电大学经济管理学院面向对象程序设计上级实验课程对象数组与对象指针对象数组与对象指针一实验目的与要求1 掌握数组与指针的定义与使用方法。2 理解组与指针的存储分配与表示。3 学习函数传递数组的方法。4 学习用指针和引用向函数传递参数。5 学习静态数据成员和静态成员函数的使用。6 理解友元与友元函数的作用与使用方法。二实验准备与内容1 设计一个矩阵类Matrix(矩阵由二维数组实现),有分配空间和对矩阵赋值的功能。2 练习将这个矩阵类的对象作为参数传送到函数Mul(),用普通,指针和引用三种方法实现,并要注意这三种方式的区别。(1) 直接传送:Mul(Matrix a,Matrix b)。实际上只是传送值,在函数中针对对象的任何修改均不影响该对象本身。(2) 指针传送:Mul(Matrix *pa,Matrix *pb)。要注意指针的级数。(3) 引用传送:Mul(Matrix &a,Matrix &b)这种调用将影响参数的实际值。3 将Mul函数实现:完成对传送的两个Martix对象的相乘运算。下面给出矩阵相乘的算法:矩阵aIj与矩阵bxy相乘,条件是jx。乘积是一个新的矩阵cIj,其中cIj的值是(aIk*bky)其中k0,1,2,j。4 在Matrix类中定义一个静态数据成员,记录当前所有Matrix对象的数量。5 定义一个友元函数实现转制功能。转制是指将数组中aij与aji的值对调。三实验方法与步骤1 建立一个工程。在工程中定义一个Matrix类,在构造函数中根据参数创建数据成员:一个二维数组。提示:用构造函数记录二维数组的大小(unsigned int x, unsigned int y)。类中实际定义的二维数组的数据成员是一个指针(二级指针),int*pMatrix。在构造函数中根据传送的参数为这个二维数组分配空间:pMatrixnew intxy。2 设计成员函数,完成对数组的赋值的功能。本例中定义的成员函数为SetValue(unsigned int x, unsigned inty,int value)。3 参考以上的说明,以常用三种方式实现向Mul()函数传递参数,并返回函数相乘的结果。4 在类中定义一个静态数据成ObjectAliveNo,记录当前共有几个Matrix类的对象。实现方法:可以在对象的构造函数中向该数据成员报告(使静态数据成员加1);在析构函数中也向该数据成员报告(使静态数据成员减1)。并要注意,在程序开始时,给这个静态数据成员赋初值。5 在Matrix类中定义一个友元函数,使其具有对Matrix类的对象内的数组进行转制功能。6 写出实验报告结合思考与练习题,写出实验报告程序实现:#includematrix.h#includeusingnamespacestd;classMatrixprivate:int*pmatrix;intimaxx,imaxy;staticintmatrixnum;public:Matrix(unsignedintx,unsignedinty);Matrix(Matrix&m);Matrix();boolSetValue(unsignedintx,unsignedinty,intvalue);voidinput();voidprint()const;Matrixoperator*(Matrix&m);Matrixoperator=(Matrix&m);friendMatrixRotate(Matrix&m);friendMatrixMul(Matrixa,Matrixb);intMatrix:matrixnum=0;Matrix:Matrix(unsignedintx,unsignedinty)pmatrix=newint*x;if(!pmatrix)cerrMatrixconstructingerrorendl;exit(0);for(inti=0;ix;i+)pmatrixi=newinty;imaxx=x;imaxy=y;matrixnum+;Matrix:Matrix(Matrix&m)imaxx=m.imaxx;imaxy=m.imaxy;pmatrix=newint*imaxx;if(!pmatrix)cerrMatrixconstructionerrorendl;exit(0);for(inti=0;iimaxx;i+)pmatrixi=newintimaxy;for(i=0;iimaxx;i+)for(intj=0;jimaxy;j+)pmatrixij=m.pmatrixij;matrixnum+;MatrixMatrix:operator=(Matrix&m)for(inti=0;iimaxx;i+)deletepmatrixi;deletepmatrix;imaxx=m.imaxx;imaxy=m.imaxy;pmatrix=newint*imaxx;if(!pmatrix)cerrMatrixconstructionerrorendl;exit(0);for(i=0;iimaxx;i+)pmatrixi=newintimaxy;for(i=0;iimaxx;i+)for(intj=0;jimaxy;j+)pmatrixij=m.pmatrixij;matrixnum+;return*this;Matrix:Matrix()for(inti=0;i=imaxx)|(y=imaxy)cerrInvalid(x,y):x,yendl;returnfalse;elsepmatrixxy=value;returntrue;voidMatrix:input()intix,iy,value;for(ix=0;iximaxx;ix+)for(iy=0;iyvalue;SetValue(ix,iy,value);voidMatrix:print()constintix,iy;coutSumofmatrixobjects=matrixnumendl;coutMatrix(imaxx,imaxy)is;for(ix=0;iximaxx;ix+)coutendl;for(iy=0;iyimaxy;iy+)coutpmatrixixiy;MatrixMatrix:operator*(Matrix&m)if(imaxy!=m.imaxx)cerrCannotmultiplyMatrixawithbendl;return*this;intix,iy,iz;Matrixc(imaxx,m.imaxy);for(ix=0;iximaxx;ix+)for(iy=0;iym.imaxy;iy+)c.pmatrixixiy=0;for(iz=0;izimaxy;iz+)c.pmatrixixiy+=pmatrixixiz*m.pmatrixiziy;returnc;MatrixRotate(Matrix&m)unsignedinti,j;Matrixmr(m.imaxy,m.imaxx);for(i=0;im.imaxx;i+)for(j=0;jm.imaxy;j+)mr.pmatrixji=m.pmatrixij;returnmr;MatrixMul(Matrixa,Matrixb)if(a.imaxy!=b.imaxx)cerrCannotmultiplyMatrixawithbendl;returna;intix,iy,iz;Matrixc(a.imaxx,b.imaxy);for(ix=0;ixa.imaxx;ix+)for(iy=0;iyb.imaxy;iy+)c.pmatrixixiy=0;for(iz=0;iza.imaxy;iz+)c.pmatrixixiy+=a.pmatrixixiz*b.pmatrixiziy;returnc;intmain()Matrixa(2,2);coutInputMatrixa22:endl;a.input();coutendl;a.print();coutendl;Matrixb(2,3);coutInputMatrixb23:endl;b.input();coutendl;b.print();coutendl;cout传值方式MultiplyMatrixawithb:endl;Matrixc=Mul(a,b);c.print();coutendl;cout运算符重载Multiplyawithb:endl;Matrixg=a*b;g.print();coutendl;coutReserveofMatrixb23:endl;Matrixf=Rotate(b);f.print();coutendl;return0;四思考与练习1 用普通,指针和引用三种方法实现传递参数,他们的区别是什么,他们的特点是什么?答:从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C+中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论