运算符重载实现矩阵运算
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;
}
转载自:黑凤梨の博客