CMatrix.h
/********************************************
CopyRight 2007 北京交通大学
工程名称: 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;
};
CMatrix.cpp
/********************************************
CopyRight 2007 北京交通大学
工程名称: 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;
}
main.cpp
/********************************************
CopyRight 2007 北京交通大学
工程名称: 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;
}