对象数组与对象指针
- 格式: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<