对象数组与对象指针

  • 格式:docx
  • 大小:28.91 KB
  • 文档页数:7

重庆邮电大学经济管理学院

面向对象程序设计上级实验课程

对象数组与对象指针

对象数组与对象指针

一.实验目的与要求

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对象的相乘运算。下面给出矩阵相乘的算法:

矩阵a[I][j]与矩阵b[x][y]相乘,条件是j==x。

乘积是一个新的矩阵c[I][j],其中c[I][j]的值是

∑(a[I][k]*b[k][y])

其中k=0,1,2,……,j。

4.在Matrix类中定义一个静态数据成员,记录当前所有Matrix对象的数量。

5.定义一个友元函数实现转制功能。转制是指将数组中a[i][j]与a[j][i]的值对调。

三.实验方法与步骤

1.建立一个工程。在工程中定义一个Matrix类,在构造函数中根据参数创建数据成员:一个二维数组。提示:用构造函数记录二维数组的大小(unsigned

int x, unsigned int y)。类中实际定义的二维数组的数据成员是一个指针(二级指针),int**pMatrix。在构造函数中根据传送的参数为这个二维数组分配空间:pMatrix=new int[x][y]。 2.设计成员函数,完成对数组的赋值的功能。本例中定义的成员函数为SetValue(unsigned int x, unsigned inty,int value)。

3.参考以上的说明,以常用三种方式实现向Mul()函数传递参数,并返回函数相乘的结果。

4.在类中定义一个静态数据成ObjectAliveNo,记录当前共有几个Matrix类的对象。实现方法:可以在对象的构造函数中向该数据成员报告(使静态数据成员加1);在析构函数中也向该数据成员报告(使静态数据成员减1)。并要注意,在程序开始时,给这个静态数据成员赋初值。

5.在Matrix类中定义一个友元函数,使其具有对Matrix类的对象内的数组进行转制功能。

6.写出实验报告

结合思考与练习题,写出实验报告

程序实现:

#include"matrix.h"

#include

using namespace std;

class Matrix {

private:

int **pmatrix;

int imaxx,imaxy;

static int matrixnum;

public:

Matrix(unsigned int x,unsigned int y);

Matrix(Matrix &m);

~Matrix();

bool SetValue(unsigned int x,unsigned int y,int value);

void input();

void print() const;

Matrix operator * (Matrix &m);

Matrix operator = (Matrix &m);

friend Matrix Rotate(Matrix &m);

friend Matrix Mul(Matrix a,Matrix b);

};

int Matrix::matrixnum=0;

Matrix::Matrix(unsigned int x,unsigned int y) {

pmatrix=new int *[x];

if(!pmatrix)

{

cerr<<"Matrix constructing error"<

exit(0);

}

for(int i=0;i

imaxx=x;

imaxy=y;

matrixnum++;

}

Matrix::Matrix(Matrix &m) {

imaxx=m.imaxx;

imaxy=m.imaxy;

pmatrix=new int *[imaxx];

if(!pmatrix) {

cerr<<"Matrix construction error"<

exit(0);

}

for(int i=0;i

pmatrix[i]=new int[imaxy];

for(i=0;i

for(int j=0;j

pmatrix[i][j]=m.pmatrix[i][j];

matrixnum++;

}

Matrix Matrix::operator =(Matrix &m) {

for(int i=0;i

delete[]pmatrix[i];

delete[]pmatrix;

imaxx=m.imaxx;

imaxy=m.imaxy;

pmatrix=new int *[imaxx];

if(!pmatrix)

{

cerr<<"Matrix construction error"<

exit(0);

}

for(i=0;i

pmatrix[i]=new int[imaxy];

for(i=0;i

for(int j=0;j

pmatrix[i][j]=m.pmatrix[i][j];

matrixnum++;

return *this;

}

Matrix::~Matrix() { for(int i=0;i

delete[]pmatrix[i];

delete[]pmatrix;

matrixnum--;

}

bool Matrix::SetValue(unsigned int x,unsigned int y,int value) {

if((x>=imaxx)||(y>=imaxy)){

cerr<<"Invalid(x,y): "<

return false;

}

else {

pmatrix[x][y]=value;

return true;

}

}

void Matrix::input() {

int ix,iy,value;

for(ix=0;ix

for(iy=0;iy

{

cin>>value;

SetValue(ix,iy,value);

}

}

void Matrix::print()const {

int ix,iy;

cout<<"Sum of matrix objects = "<

cout<<"Matrix ("<

for(ix=0;ix

cout<

for(iy=0;iy

cout<

}

}

Matrix Matrix::operator * (Matrix &m) {

if(imaxy!=m.imaxx) {

cerr<<"Cannot multiply Matrix a with b"<

return *this;

}

int ix,iy,iz;

Matrix c(imaxx,m.imaxy);

for(ix=0;ix

for(iy=0;iy

c.pmatrix[ix][iy]=0; for(iz=0;iz

c.pmatrix[ix][iy]+=pmatrix[ix][iz]*m.pmatrix[iz][iy];

}

return c;

}

Matrix Rotate(Matrix &m) {

unsigned int i,j;

Matrix mr(m.imaxy,m.imaxx);

for(i=0;i

for(j=0;j

mr.pmatrix[j][i]=m.pmatrix[i][j];

return mr;

}

Matrix Mul(Matrix a,Matrix b) {

if(a.imaxy!=b.imaxx) {

cerr<<"Cannot multiply Matrix awith b"<

return a;

}

int ix,iy,iz;

Matrix c(a.imaxx,b.imaxy);

for(ix=0;ix

for(iy=0;iy

c.pmatrix[ix][iy]=0;

for(iz=0;iz

c.pmatrix[ix][iy]+=a.pmatrix[ix][iz]*b.pmatrix[iz][iy];

}

return c;

}

int main() {

Matrix a(2,2);

cout<<"Input Matrix a[2][2] :"<

a.input();

cout<