下面主函数和CMatrix类完成矩阵的输入、输出。请补齐CMatrix类中需要的成员函数。 注意:主函数和CMatrix类已给代码不可修改,只可在CMatrix类中添加新的成员函数,并补充完整未实现的成员函数。修改已知代码不计分。 提示:根据已给代码分析CMatrix需要重载哪些运算符?
时间: 2024-03-27 22:38:20 浏览: 90
CMatrix类需要重载的运算符有:加法运算符、减法运算符、乘法运算符、赋值运算符、相等运算符、取反运算符、输入运算符和输出运算符。
下面是补充完整的CMatrix类代码:
```cpp
#include<iostream>
using namespace std;
class CMatrix{
public:
CMatrix(int r=0,int c=0):row(r),col(c){ //构造函数
if(row*col==0) ptr=NULL;
else{
ptr=new double*[row];
for(int i=0;i<row;i++)
ptr[i]=new double[col];
}
}
CMatrix(const CMatrix& m):row(m.row),col(m.col){ //拷贝构造函数
if(row*col==0) ptr=NULL;
else{
ptr=new double*[row];
for(int i=0;i<row;i++){
ptr[i]=new double[col];
for(int j=0;j<col;j++)
ptr[i][j]=m.ptr[i][j];
}
}
}
~CMatrix(){ //析构函数
if(ptr!=NULL){
for(int i=0;i<row;i++)
delete[]ptr[i];
delete[]ptr;
}
}
CMatrix operator+(const CMatrix& m)const; //加法运算符重载
CMatrix operator-(const CMatrix& m)const; //减法运算符重载
CMatrix operator*(const CMatrix& m)const; //乘法运算符重载
CMatrix& operator=(const CMatrix& m); //赋值运算符重载
bool operator==(const CMatrix& m)const; //相等运算符重载
CMatrix operator-()const; //取反运算符重载
friend istream& operator>>(istream& is,CMatrix& m); //输入运算符重载
friend ostream& operator<<(ostream& os,const CMatrix& m); //输出运算符重载
private:
int row,col;
double **ptr;
};
CMatrix CMatrix::operator+(const CMatrix& m)const{ //加法运算符重载
if(row!=m.row || col!=m.col) throw "加法运算符重载:矩阵维度不一致!";
CMatrix temp(row,col);
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
temp.ptr[i][j]=ptr[i][j]+m.ptr[i][j];
return temp;
}
CMatrix CMatrix::operator-(const CMatrix& m)const{ //减法运算符重载
if(row!=m.row || col!=m.col) throw "减法运算符重载:矩阵维度不一致!";
CMatrix temp(row,col);
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
temp.ptr[i][j]=ptr[i][j]-m.ptr[i][j];
return temp;
}
CMatrix CMatrix::operator*(const CMatrix& m)const{ //乘法运算符重载
if(col!=m.row) throw "乘法运算符重载:矩阵维度不匹配!";
CMatrix temp(row,m.col);
for(int i=0;i<row;i++)
for(int j=0;j<m.col;j++){
temp.ptr[i][j]=0;
for(int k=0;k<col;k++)
temp.ptr[i][j]+=ptr[i][k]*m.ptr[k][j];
}
return temp;
}
CMatrix& CMatrix::operator=(const CMatrix& m){ //赋值运算符重载
if(ptr==m.ptr) return *this;
if(row*col!=m.row*m.col){
for(int i=0;i<row;i++) delete[]ptr[i];
delete[]ptr;
row=m.row;
col=m.col;
ptr=new double*[row];
for(int i=0;i<row;i++)
ptr[i]=new double[col];
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
ptr[i][j]=m.ptr[i][j];
return *this;
}
bool CMatrix::operator==(const CMatrix& m)const{ //相等运算符重载
if(row!=m.row || col!=m.col) return false;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
if(ptr[i][j]!=m.ptr[i][j]) return false;
return true;
}
CMatrix CMatrix::operator-()const{ //取反运算符重载
CMatrix temp(row,col);
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
temp.ptr[i][j]=-ptr[i][j];
return temp;
}
istream& operator>>(istream& is,CMatrix& m){ //输入运算符重载
for(int i=0;i<m.row;i++)
for(int j=0;j<m.col;j++)
is>>m.ptr[i][j];
return is;
}
ostream& operator<<(ostream& os,const CMatrix& m){ //输出运算符重载
for(int i=0;i<m.row;i++){
for(int j=0;j<m.col;j++)
os<<m.ptr[i][j]<<" ";
os<<endl;
}
return os;
}
```
阅读全文