C++编程入门--矩阵类重载运算符

题目:定义3×3矩阵类Matrix,在其中重载运算符“+”、“-”、“*”,实现矩阵的基本运算。

首先,我们先确定这个矩阵类的基本功能,我们来声明其成员函数的功能,列出来如下:

#include<iostream>
using namespace std;

class Matrix{       //矩阵类
private:
	int row, column;        //成员变量行和列
	int pt[10][10];         //定义一个最大为10×10的矩阵
public:
	Matrix();				//构造函数初始化矩阵行和列
	Matrix(int r, int c);
	~Matrix();
	Matrix operator+(Matrix &x);		  //矩阵+运算,双目
	Matrix operator-(Matrix &x);		  //矩阵-运算,双目
	Matrix operator*(const Matrix &x);    //矩阵*运算,双目
	Matrix operator=(const Matrix &x);    //声明重载“=”运算符
	void Set_rowcol(int m,int n);         //设置矩阵行和列
	void SetMatrix();					  //设置矩阵元素
	void ShowMatrix();					  //输出矩阵
};

确定好类的基本功能之后,我们来逐个实现:

首先是构造函数系列:

Matrix::Matrix(){						  //构造函数初始化矩阵行和列
	row = 0; column = 0;
}
Matrix::Matrix(int r, int c) :row(r), column(c){   //构造函数重载,初始化矩阵元素
	for (int i = 0; i < row; i++)
		for (int j = 0; j < column; j++)
			pt[i][j] = 0;
}
Matrix::~Matrix(){}   //析构函数

运算符重载实现:

    Matrix Matrix::operator+(Matrix &x){    //矩阵+运算,双目运算符
	Matrix temp(row, x.column);
	for (int i = 0; i < row; i++){
		for (int j = 0; j < column; j++)
			temp.pt[i][j] = pt[i][j] + x.pt[i][j];
	}
	return temp;
}
Matrix Matrix::operator-(Matrix &x){    //矩阵-运算,双目运算符
	Matrix temp(row, x.column);
	for (int i = 0; i < row; i++){
		for (int j = 0; j < column; j++)
			temp.pt[i][j] = pt[i][j] - x.pt[i][j];
	}
	return temp;
}
Matrix Matrix::operator*(const Matrix &x){    //矩阵*运算,双目运算符
	Matrix temp(row, x.column);
	for (int i = 0; i < row; i++){
		for (int j = 0; j < x.column; j++){
			for (int k = 0; k < column; k++)
				temp.pt[i][j] += pt[i][k] * x.pt[k][j];
		}
	}
	return temp;
}
Matrix Matrix::operator=(const Matrix &x){  //复制运算符=重载,只能重载为成员函数
	for (int i = 0; i < row; i++)
		for (int j = 0; j < column; j++)
			(*this).pt[i][j] = x.pt[i][j];
	return *this;
}

然后就是矩阵的输入和输出函数功能实现:

void Matrix::Set_rowcol(int m,int n){
	row = m;
	column = n;
}

void Matrix::SetMatrix(){      //设置矩阵元素
	for (int i = 0; i < row; i++){
		for (int j = 0; j < column; j++){
			cin >> pt[i][j];
		}
	}
}
void Matrix::ShowMatrix(){     //输出矩阵
	for(int i = 0; i < row; i++)
	{
		for (int j = 0; j < column; j++)
			cout << pt[i][j] << " ";
		cout << endl;
	}
}

最后编写主函数测试:

int main(){
	int i1, j1, i2, j2;
	Matrix m1, m2, m3;

	cout << "输入第一个矩阵m1的行和列:" << endl;
	cin >> i1 >> j1;
	m1.Set_rowcol(i1, j1);
	cout << "请输入第一个矩阵m1元素:" << endl;
	m1.SetMatrix();

	cout << "输入第二个矩阵m2的行和列:" << endl;
	cin >> i2 >> j2;
	m2.Set_rowcol(i2, j2);
	cout << "请输入第二个矩阵m2元素:" << endl;
	m2.SetMatrix();

	m3.Set_rowcol(i1, j2);  //结果矩阵的行是m1的行,列是m2的列

	m3 = m1 + m2;
	cout << "m3=m1+m2:" << endl;
	m3.ShowMatrix();

	m3 = m1 - m2;
	cout << "m3=m1-m2:" << endl;
	m3.ShowMatrix();

	m3 = m1 * m2;
	cout << "m3=m1*m2:" << endl;
	m3.ShowMatrix();
	return 0;
}

运行结果:

这个程序中间其实还是有很多瑕疵的,但是我们今天的主题是运算符的重载,还有矩阵列类的实现,请忽略或提出建议。

  • 37
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,针对您的问题,我可以给出以下代码示例: ```cpp #include <iostream> #include <vector> using namespace std; class Matrix { private: int row, col; vector<vector<int>> data; public: Matrix(int r, int c) : row(r), col(c), data(r, vector<int>(c)) {} Matrix operator+(const Matrix& other) const { if (row != other.row || col != other.col) { throw runtime_error("Matrix dimensions do not match."); } Matrix res(row, col); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { res.data[i][j] = data[i][j] + other.data[i][j]; } } return res; } Matrix operator-(const Matrix& other) const { if (row != other.row || col != other.col) { throw runtime_error("Matrix dimensions do not match."); } Matrix res(row, col); for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { res.data[i][j] = data[i][j] - other.data[i][j]; } } return res; } Matrix operator*(const Matrix& other) const { if (col != other.row) { throw runtime_error("Matrix dimensions do not match."); } Matrix res(row, other.col); for (int i = 0; i < row; ++i) { for (int j = 0; j < other.col; ++j) { for (int k = 0; k < col; ++k) { res.data[i][j] += data[i][k] * other.data[k][j]; } } } return res; } friend ostream& operator<<(ostream& os, const Matrix& mat) { for (int i = 0; i < mat.row; ++i) { for (int j = 0; j < mat.col; ++j) { os << mat.data[i][j] << " "; } os << endl; } return os; } friend istream& operator>>(istream& is, Matrix& mat) { for (int i = 0; i < mat.row; ++i) { for (int j = 0; j < mat.col; ++j) { is >> mat.data[i][j]; } } return is; } }; int main() { Matrix A(2, 3), B(3, 2); cin >> A >> B; cout << A * B << endl; return 0; } ``` 这是一个简单的矩阵类,支持加、减、乘运算符重载。其中,加、减运算符要求两个矩阵的维度相同,乘运算符要求左矩阵的列数等于右矩阵的行数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值