这篇文章主要为大家详细介绍了如何利用C++实现重载矩阵的部分运算符,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
前言
博主本人为C++菜鸟一只,本篇博客也是第一次写,主要目的用于自己mark,如有错误欢迎指出
本博客代码为我做C++实验时的代码,由于自己是菜鸟,所以代码内容掌握的也不是很熟。
在此记下此篇,待到日后查看也是属于自己青春的一部分吧。
正文
整个工程分为头文件,source,以及main构成。
工程的目的为实现对矩阵运算符‘+’,‘-’,‘*’,‘==’,‘!=’,‘<<’和‘>>’的重载,并在main中测试其情况。
以下为头文件
//Matrix.h
#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
using namespace std;
class Matrix
{
public:
Matrix operator + (Matrix&a);//重载 +
Matrix operator - (Matrix&b);//重载 -
Matrix operator * (Matrix&c);//重载 *
bool operator == (Matrix&d);//重载 ==
bool operator != (Matrix&e);//重载 !=
friend ostream& operator << (ostream&,Matrix&);//重载 <<
friend istream& operator>>(istream&,Matrix&);//重载 >>
void setMatrix(int a, int b);//设置矩阵行列
private:
int row;
int col;
int matrix[200][200];
};
#endif
关于 void setMatrix(int a, int b); 其实这个函数可以不设置,利用构造函数可以完成该功能,甚至更完美。但我有些小懒,就不想去修改了,如果出事的话…QAQ还是希望不会出事吧。
还有就是,矩阵我设置成了200*200,其实可以利用new调用动态内存来更好的实现,但由于我太菜,不想去用二重指针,故放弃了这个方案。
以下为cpp文件
//Matrix.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
void Matrix::setMatrix(int a, int b)//构造函数可以取代这个
{
row=a;
col=b;
}
Matrix Matrix::operator + (Matrix &a)//重载 +
{
if (row!=a.row||col!=a.col)
{
throw"这两个矩阵不可相加";
}
抛出异常,之所以使用这个,是因为没法cout<<“错误”;之后return 0强制退出,因为返回类型是矩阵,我当时没有尝试利用exit()函数…(果然我太菜了QAQ)
else//矩阵元素相加
{
Matrix sum;//创建新矩阵,为接下来返回矩阵用
sum.row=row;
sum.col=col;
for(int i=0; i<sum.row; i++)
{
for(int j=0; j<sum.col; j++)
{
sum.matrix[i][j]=matrix[i][j]+a.matrix[i][j];//矩阵加法计算规则
}
}
return sum;//返回值为sum矩阵
}
}
计算规则需要自己确定(代几应该都学过),如这个是加法,规则如上:sum矩阵的各位置元素分别为’+‘前矩阵和’+'后矩阵对应位置元素的和。
Matrix Matrix::operator-(Matrix &b)//重载 -
{
if (row!=b.row||col!=b.col)
{
throw"这两个矩阵不可相减!";//抛出异常
}
else//矩阵元素相减
{
Matrix reduce;
reduce.row=row;
reduce.col=col;
for(int i=0; i<reduce.row; i++)
{
for(int j=0; j<reduce.col; j++)
{
reduce.matrix[i][j]=matrix[i][j]-b.matrix[i][j];//减法规则
}
}
return reduce;
}
}
减法和加法类似,可以模仿着加法来,注意下计算规则就行
Matrix Matrix::operator*(Matrix&c)
{
if (col!=c.row)
{
throw"这两个矩阵不可相乘!";
}
else//矩阵元素相乘
{
Matrix multi;
multi.row=row;//新矩阵的行等于第一个矩阵的行
multi.col=c.col;//新矩阵的列等于第二关矩阵的列
for(int i=0; i<multi.row; i++)
{
for(int j=0; j<multi.col; j++)//为新矩阵元素赋值时注意新矩阵元素个数
{
multi.matrix[i][j]=0;//初始化新矩阵元素为0,为后面递加做准备
for(int k=0; k<col; k++)
{
multi.matrix[i][j]+=matrix[i][k]*c.matrix[k][j];//乘法计算规则
}
}
}
return multi;
}
}
关于矩阵乘法的规则可以拿张纸先演算一下,这样方便自己理解。
bool Matrix::operator == (Matrix&d)//判断矩阵是否相等
{
if (row!=d.row||col!=d.col)//先判断行列是否相等
{
return false;
}
for(int i=0; i<row; i++)//再判断元素是否相等,只要有一个不等,立刻返回false
{
for(int j=0; j<col; j++)
{
if(matrix[i][j]!=d.matrix[i][j])
{
return false;
}
}
}
return true;
}
bool Matrix::operator != (Matrix&e)//判断矩阵是否不等
{
if (row!=e.row||col!=e.col)
{
return true;//原理同上,注意返回相反值
}
for(int i=0; i<row; i++)//原理同上,注意返回相反值
{
for(int j=0; j<col; j++)
{
if(matrix[i][j]!=e.matrix[i][j])
{
return true;
}
}
}
return false;
}
ostream& operator << (ostream &out,Matrix& mat)//重载输出矩阵
{
for (int i = 0; i < mat.row; i++)
{
for (int j = 0; j < mat.col; j++)
{
out << mat.matrix[i][j];//将矩阵元素输出,注意矩阵元素的间距
if (j == mat.col - 1)
out << endl;
else out << " ";
}
}
return out;//返回输出流
}
istream& operator>>(istream&in, Matrix &mat)//重载输入矩阵
{
for (int i = 0; i < mat.row; i++)
{
for (int j = 0; j < mat.col; j++)
{
in >> mat.matrix[i][j];//由行到列一次输入元素
}
}
return in;//返回输入流
}
以下为main.cpp,主要用于测试。
//main.cpp
#include <iostream>
#include "Matrix.h"
using namespace std;
int main()
{
int row, col;
Matrix A;
cout<<"Please input rows cols:\n";
cin>>row>>col;//输入行列
A.setMatrix(row,col);//为矩阵设置行列
cout<<"Please input your matrix elements:\n";
cin>>A;//输入元素,因为已经重载了>>,所以可以直接在>>后面加矩阵类A
cout<<"以下是你创建的第一个矩阵!\n";
cout<<A<<endl;//输出元素,因为已经重载了<<,所以可以直接在<<后面加矩阵类A
Matrix B;//另一个矩阵
cout<<"Please input another one's rows cols:\n";
cin>>row>>col;
B.setMatrix(row,col);
cout<<"Please input your matrix elements:\n";
cin>>B;
cout<<"以下是你创建的第二个矩阵!\n";
cout<<B<<endl;
try//这是和throw,catch配合使用的关键字。具体使用可以谷歌或者百度
{
Matrix sum=A+B;
cout<<"两个矩阵相加为:\n";
cout<<sum<<endl;
}
catch (const char* msg)//如果throw抛出了异常,会(根据情况)捕获异常
{
cerr<< msg << endl;//打印异常语句
}
try
{
Matrix reduce=A-B;
cout<<"两个矩阵相减为:\n";
cout<<reduce<<endl;
}
catch (const char* msg)
{
cerr<< msg << endl;
}
try
{
Matrix multi=A*B;
cout<<"两个矩阵相乘为:\n";
cout<<multi<<endl;
}
catch (const char* msg)
{
cerr<< msg << endl;
}
if(A==B)//测试 == 是否重载成功
cout<<"两个矩阵相等!( == 为真测试通过!)"<<endl;
else
cout<<"两个矩阵不相等!( == 为假测试通过!)"<<endl;
if(A!=B)// 测试 !=是否重载成功
cout<<"矩阵不相等!( != 为真测试通过!)"<<endl;
else
cout<<"矩阵相等!( != 为假测试通过!)"<<endl;
return 0;
}
运行结果
矩阵相乘:
矩阵相加减:
以上就是C++实现重载矩阵的部分运算符的详细内容,更多关于C++重载矩阵运算符的资料请关注编程学习网其它相关文章!
本文标题为:C++实现重载矩阵的部分运算符
基础教程推荐
- C++中的atoi 函数简介 2023-01-05
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- 一文带你了解C++中的字符替换方法 2023-07-20
- 如何C++使用模板特化功能 2023-03-05
- C利用语言实现数据结构之队列 2022-11-22
- C++详细实现完整图书管理功能 2023-04-04
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C/C++编程中const的使用详解 2023-03-26
- 详解c# Emit技术 2023-03-25
- C语言 structural body结构体详解用法 2022-12-06