C++运算符重载实现矩阵运算

运算符重载实现矩阵运算

rectangle.h

#include<iostream>
using namespace std;
class CRectangle
{
private:
	int row, col;//矩阵的行与列
	int* datas;//存储矩阵的数据
	static int dummy;//下标越界时的哑元素
	void init();
public:
	//定义空矩阵构造函数
	CRectangle()
	{
		row = 0;
		col = 0;
		datas = NULL;
		init();
	}
	//定义rowXcol矩阵构造函数
	CRectangle(int r,int c)
	{
		row = r;
		col = c;
		datas = new int[r * c];
		init();
	}
	//拷贝构造函数
	CRectangle(const CRectangle& a);
	//析构函数
	~CRectangle(){ delete datas; }
	//数与矩阵相乘
	friend CRectangle operator *(int x, const CRectangle& a);
	//取矩阵i,j位置处的元素
	int& operator ()(int i, int j);
	//将矩阵所有元素加1,前缀运算
	CRectangle operator ++();
	//将矩阵所有元素赋给另一个矩阵
	CRectangle& operator =(const CRectangle& a);
	//两矩阵相加
	CRectangle operator +(const CRectangle& a) const;
	//两矩阵相减
	CRectangle operator -(const CRectangle& a) const
	{
		return *this+ -a;
	}
	//两矩阵相乘
	CRectangle operator *(const CRectangle& a) const;
	//求转置矩阵
	CRectangle operator !() const;
	//-1与矩阵相乘
	CRectangle operator -() const
	{
		return  - (*this);
	}

	CRectangle operator +=(const CRectangle& a) ;
	CRectangle operator -=(const CRectangle& a)
	{
		return *this += -a;
	}
	CRectangle operator *=(const CRectangle& a);
	void show()const;
};

rectangle.cpp

#include "rectangle.h"
//拷贝构造函数的实现
CRectangle::CRectangle(const CRectangle& a)
{
	row = a.row;
	col = a.col;
	datas = new int[row * col];
	for (int i = 0;i < row * col;i++)
	{
		datas[i] = a.datas[i];//分配动态存储空间并赋初值
	}

}

//数与矩阵相乘
CRectangle operator *(int x, const CRectangle& a) 
{
	CRectangle tmp(a);
	for (int i = 0;i < a.row * a.row;i++)
	{
		tmp.datas[i] *= x;
	}
	return tmp;
}
//访问矩阵中的元素
int& CRectangle::operator()(int i, int j)
{
	if (i<1 || i>row || j<1 || j>col)
	{
		cout << "行列下标越界错误!" << endl;
		return dummy;
	}
	return datas[(i - 1) * col + j - 1];
}
//将矩阵所有元素加1,前缀运算
CRectangle  CRectangle::operator ++()
{
	CRectangle tmp(*this);
	for (int i = 0;i < row * col;i++)
	{
		tmp.datas[i]++;
	}
	return tmp;
}
//将矩阵所有元素赋给另一个矩阵
CRectangle& CRectangle::operator =(const CRectangle& a)
{
	delete datas;
	row = a.row;
	col = a.col;
	datas = new int[row * col];
	for (int i = 0;i < row * col;i++)
	{
		datas[i] = a.datas[i];
	}
	return *this;
}
//两矩阵相加
CRectangle CRectangle::operator +(const CRectangle& a) const
{
	if (row != a.row || col != a.col) 
	{
		CRectangle tmp;
		return tmp;
	}
	CRectangle tmp(*this);
	for (int i = 0;i < row * col;i++)
	{
		tmp.datas[i] += a.datas[i];
		return tmp;
	}
}
//两矩阵相乘
CRectangle CRectangle::operator *(const CRectangle& a) const
{
	if (col != a.row)
	{
		CRectangle tmp;
		return tmp;
	}
	CRectangle tmp(row, a.col);
	for (int i = 1;i <= row;i++)
	{
		for (int j = 1;j <= a.col;j++)
		{
			for (int k = 1;k <= col;k++)
			{
				tmp.datas[(i - 1) * tmp.col + j - 1] += 
			this->datas[(i - 1) * col + k - 1] * a.datas[(k - 1) * a.col + j - 1];
			}
		}
	}
	return tmp;
}
//求转置矩阵
CRectangle CRectangle::operator !() const
{
	CRectangle tmp(col, row);
	for (int i = 1;i <= row;i++)
	{
		for (int j = 1;j <= col;j++)
		{
			tmp.datas[(j - 1) * tmp.col + i - 1] = this->datas[(i - 1) * col + j - 1];
		}
	}
	return tmp;
}

CRectangle CRectangle::operator +=(const CRectangle& a)
{
	if (row != a.row || col != a.col)
	{
		CRectangle tmp;
		return tmp;
	}
	for (int i = 0;i < row * col;i++)
	{
		datas[i] += a.datas[i];
	}
	return *this;
}

CRectangle CRectangle::operator *=(const CRectangle& a)
{
	if (col != a.row)  return CRectangle();

	return *this = (*this) * a;
}

void CRectangle::show()const
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < col;j++)
		{
			cout << datas[i * col + j]<<"   \t";
		}
		cout << endl;
	}
}
//初始化矩阵
void CRectangle::init()
{
	for (int i = 0;i < row * col;i++)
	{
		datas[i] = 0;
	}
}
//定义静态哑元素
int CRectangle::dummy;

main.cpp

#include"rectangle.h"
int main()
{
	CRectangle a(3, 3), b(3, 3), c;
	for (int i = 1;i <= 3;i++)
	{
		for (int j = 1;j <= 3;j++)
		{
			a(i, j) = i + 1;
			b(i, j) = j + 1;
		}
	}
	c = a * b;
	cout << "矩阵a为:" << endl;
	a.show();
	cout << "矩阵b为:" << endl;
	b.show();
	cout << "矩阵a*b为:" << endl;
	c.show();
	cout << "矩阵b的转置为:" << endl;
	(!b).show();
	cout << "矩阵-b为:" << endl;
	(-b).show();
	cout << "矩阵a各个元素加1为:" << endl;
	(++a).show();
	cout << "矩阵a各个元素乘3为:" << endl;
	(3*a).show();


	system("pause");
	return 0;
}

在这里插入图片描述
转载自:黑凤梨の博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值