C++大作业–矩阵类的下标[][]

CMatrix.h

[cpp]
/********************************************

CopyRight 2007 北京交通大学 计科0601 李赫元

工程名称: NewMatrix

文件名: CMatrix.h

修改日期: 2007-4-21 11:21:28

描述: 定义了矩阵类的+ – = []等接口

********************************************/

#include <iostream>

class CMatrix

{

public:

// 根据"三原则" 必须显示定义构造\拷贝\析构函数

CMatrix(int r,int c);

CMatrix(const CMatrix &zMatrix);

CMatrix& operator = (const CMatrix &zMatrix);

~CMatrix();

// 定义加减接口

CMatrix operator + (const CMatrix &zMatrix);

CMatrix operator – (const CMatrix &zMatrix);

// 定义[]下标访问,无赖但是有效的声明,此后必须全部用二元[]赋值

int* operator [] (int pos);

// 定义<<的友元接口

friend std::ostream& operator << (std::ostream& out,const CMatrix &zMatrix);

private:

// 存数据区域

int * m_elem;

// 存矩阵行列

int m_row,m_col;

};
[/cpp]

CMatrix.cpp

[cpp]
/********************************************
CopyRight 2007 北京交通大学 计科0601 李赫元
工程名称: NewMatrix
文件名: CMatrix.cpp
修改日期: 2007-4-21 11:20:39
描述: 实现了矩阵类的加减和下标运算
********************************************/

#include "CMatrix.h"
#include <iostream>
#include <iomanip>

CMatrix::CMatrix(int r,int c)
:m_col(c),m_row(r)
{
m_elem = new int[m_col * m_row];

// 安全检查,防分配失败
if (!m_elem)
{
throw ;
}

memset(m_elem,0,sizeof(int) * m_col * m_row);

}

CMatrix::CMatrix(const CMatrix &zMatrix)
{
m_col = zMatrix.m_col;
m_row = zMatrix.m_row;

m_elem= new int[m_col * m_row];

memcpy(m_elem,zMatrix.m_elem,sizeof(int)*m_col*m_row);
}

CMatrix& CMatrix::operator =(const CMatrix &zMatrix)
{
// 防内存泄露
if(m_elem)
delete [] m_elem;

m_col = zMatrix.m_col;
m_row = zMatrix.m_row;

m_elem = new int[m_col * m_row];

memcpy(m_elem,zMatrix.m_elem,sizeof(int)*m_col*m_row);

return *this;
}

CMatrix::~CMatrix()
{
delete [] m_elem;
}

std::ostream& operator << (std::ostream& out,const CMatrix &zMatrix)
{
for(int i=0;i!=zMatrix.m_row * zMatrix.m_col;++i)
{

out<<std::setw(2)<<zMatrix.m_elem[i]<<" ";

// 换行
if(!((i+1)%zMatrix.m_col))
out<<std::endl;
}

return out;
}

int* CMatrix::operator [] (int pos)
{
return &m_elem[m_col * pos];
}

CMatrix CMatrix::operator +(const CMatrix &zMatrix)
{
if(m_col != zMatrix.m_col || m_row != zMatrix.m_row)
{
std::cout<<"不同型矩阵无法相加";
throw ;
}

CMatrix rMatrix(*this);
for(int i=0;i != m_col * m_row;++i)
rMatrix.m_elem[i] += zMatrix.m_elem[i];

return rMatrix;
}

CMatrix CMatrix::operator -(const CMatrix &zMatrix)
{
if (m_col != zMatrix.m_col || m_row != zMatrix.m_row)
{
std::cout<<"不同型矩阵无法相加";
throw ;
}

CMatrix rMatrix(*this);

for(int i=0;i!=m_col * m_row;++i)
rMatrix.m_elem[i] -= zMatrix.m_elem[i];

return rMatrix;
}
[/cpp]

main.cpp

[cpp]
/********************************************

CopyRight 2007 北京交通大学 计科0601 李赫元

工程名称: NewMatrix

文件名: main.cpp

修改日期: 2007-4-21 11:21:08

描述: 对矩阵类的各项操作进行测试

********************************************/

#include "CMatrix.h"
#include <iostream>

int main()
{
CMatrix m1(3,4);

for(int i=0;i!=3;++i)
for(int j=0;j!=4;++j)
m1[i][j]=7;

m1[0][0]=5;

std::cout<<"m1:\n"<<m1;

CMatrix m2(3,4);

for(i=0;i!=3;++i)
for(int j=0;j!=4;++j)
m2[i][j]=i+j;

std::cout<<"m2:\n"<<m2;

std::cout<<"m1+m2:\n"<<m1+m2;

m2=m1;

std::cout<<"m2:\n"<<m2;

std::cout<<"m2-m1:\n"<<m2-m1;
return 0;
}
[/cpp]

Leave a Reply

Your email address will not be published.