C++实验1 CMatrix类设计与实现

一、构造函数
CMatrix(): 不带参数的构造函数;

CMatrix::CMatrix() :m_nRow(0), m_nCol(0), m_pData(0)
{

}


CMatrix(int nRow, int nCol, double *pData=NULL) : 带行、列及数据指针等参数的构造函数,并且参数带默认值;

CMatrix::CMatrix(int nRow, int nCol, double* pData) : m_pData(0)
{
	Create(nRow, nCol, pData);
}


CMatrix(const char * strPath): 带文件路径参数的构造函数;

CMatrix::CMatrix(const char* strPath)
{
	m_pData = 0;
	m_nRow = m_nCol = 0;
	ifstream cin(strPath);
	cin >> *this;
}


CMatrix(const CMatrix& m): 拷贝构造函数

CMatrix::CMatrix(const CMatrix& m) : m_pData(0)
{
	*this = m;
}


此外会用列表初始化成员变量:CMatrix(): m_nRow(0), m_nCol(0), m_pData(NULL);

CMatrix::CMatrix() :m_nRow(0), m_nCol(0), m_pData(0)
{

}


bool Create(int nRow, int nCol, double *pData=NULL): 先删除原有空间,根据传入行列创建空间,如果pData不为空要将pData的内容拷贝到m_pData中。

bool CMatrix::Create(int nRow, int nCol, double* pData)
{
	Release();
	m_pData = new double[nRow * nCol];
	m_nRow = nRow;
	m_nCol = nCol;
	if (pData)
	{
		memcpy(m_pData, pData, nRow * nCol * sizeof(double));
		return true;
	}
	else {
		return false;
	}
}


二、析构函数
~CMatrix(): 调用Release();

CMatrix::~CMatrix()
{
	Release();
}


Release(): 将内存释放,并将行列设置为0;

void CMatrix::Release() {
	if (m_pData)
	{
		delete[]m_pData;
		m_pData = NULL;
	}
	m_nRow = m_nCol = 0;
}


三、运算符重载
算术运算符重载:+, -, +=, -=


CMatrix& CMatrix::operator+=(const CMatrix& m)
{
	assert(m_nRow == m.m_nRow && m_nCol == m.m_nCol);
	for (int i = 0; i < m_nRow * m_nCol; i++)
	{
		m_pData[i] += m.m_pData[i];
	}
	return *this;
}

CMatrix operator+(const CMatrix& m1, const CMatrix& m2)
{
	CMatrix m3(m1);
	m3 += m2;
	return m3;
}


关系运算符重载:>, <, ==

bool CMatrix::operator ==(const CMatrix& m)
{
	if (!(m_nRow == m.m_nRow && m_nCol == m.m_nCol))
	{
		return false;
	}
	for (int i = 0; i < m_nRow * m_nCol; i++)
	{
		if (m_pData[i] != m.m_pData[i])
		{
			return false;
		}
	}
	return true;
}


下标操作符:[], ()

double& CMatrix::operator[](int nIndex)
{
	assert(nIndex < m_nRow * m_nCol);
	return m_pData[nIndex];
}

double& CMatrix::operator()(int nRow, int nCol)
{
	assert(nRow * m_nCol * nCol + nCol < m_nRow * m_nCol);
	return m_pData[nRow * m_nCol + nCol];
}


强制类型转换: double

CMatrix::operator double()
{
	double ds = 0;
	for (int i = 0; i < m_nRow * m_nCol; i++)
	{
		ds += m_pData[i];
	}
	return ds;
}


赋值运算符:=,尤其注意当m1=m1特殊情况的处理

CMatrix& CMatrix::operator=(const CMatrix& m)
{
	if (this != &m) {
		Create(m.m_nRow, m.m_nCol, m.m_pData);
	}
	return*this;
}


四、友元函数
输入和输出运输符:<<, >>

istream& operator>>(istream& is, CMatrix& m)
{
	is >> m.m_nRow >> m.m_nCol;
	m.Create(m.m_nRow, m.m_nCol);
	for (int i = 0; i < m.m_nRow * m.m_nCol; i++)
	{
		is >> m.m_pData[i];
	}
	return is;
}
ostream& operator<<(ostream& os, const CMatrix& m)
{
	os << m.m_nRow << " " << m.m_nCol << endl;
	double* pData = m.m_pData;
	for (int i = 0; i < m.m_nRow; i++)
	{
		for (int j = 0; j < m.m_nCol; j++)
		{
			os << *pData++ << " ";
		}
		os << endl;
	}
	return os;
}

  实验结果

输入m1为:2 2 1 2 3 4

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值