一、实验目的:
1、掌握运算符函数重载为成员函数的方法
2、掌握运算符函数重载为友元函数的方法
3、掌握不同类型数据间的转换方法
二、实验内容
假设square_matrix是n阶整型方阵,请实现下列运算:
(1)cin>> square_matrix
(2)cout<< square_matrix
(3)IntMatrix(n)生成一个n阶单位矩阵
(4)square_matrix+IntMatrix(n)
(5)square_matrix_A=square_matrix_B
三、源程序代码
1 //matrix.h 2 #include<iostream> 3 using namespace std; 4 5 class IntMatrix{ 6 public: 7 IntMatrix(int ir,int ic); 8 IntMatrix(int n);//转换构造函数:将整型n转化为n阶单位阵。 9 IntMatrix(const IntMatrix& m);//拷贝构造函数 10 friend ostream& operator<<(ostream&,const IntMatrix&); 11 friend istream& operator>>(istream&,IntMatrix&); 12 IntMatrix& operator=(const IntMatrix& m); 13 IntMatrix operator+(const IntMatrix& m); 14 ~IntMatrix(); 15 private: 16 int **p; 17 int r; 18 int c; 19 }; 20 21 //matrix.cpp 22 #include"matrix.h" 23 int i,j; 24 IntMatrix::IntMatrix(int ir,int ic):r(ir),c(ic) 25 { 26 p=new int*[r]; 27 for(i=0;i<r;i++) 28 p[i]=new int[c]; 29 cout<<"<define a ( "<<r<<","<<c<<" )matrix.>"<<endl; 30 } 31 IntMatrix::IntMatrix(int n):r(n),c(n) 32 { 33 p=new int*[r]; 34 for(i=0;i<r;i++) 35 p[i]=new int[c]; 36 for(i=0;i<r;i++) 37 for(j=0;j<c;j++) 38 if(i!=j) 39 p[i][j]=0; 40 else 41 p[i][j]=1; 42 cout<<"<define a ("<<n<<") identity matrix.>"<<endl; 43 } 44 IntMatrix::IntMatrix(const IntMatrix& m) 45 { 46 r=m.r; 47 c=m.c; 48 delete p; 49 p=new int*[r]; 50 for(i=0;i<r;i++) 51 p[i]=new int[c]; 52 for(i=0;i<r;i++) 53 for(j=0;j<c;j++) 54 p[i][j]=m.p[i][j]; 55 } 56 IntMatrix& IntMatrix::operator=(const IntMatrix& m) 57 { 58 if(this==&m) return *this; 59 if(r!=m.r||c!=m.c) cout<<"Only homography matrix can be added."<<endl; 60 else 61 { 62 delete p; 63 p=new int*[r]; 64 for(i=0;i<r;i++) 65 p[i]=new int[c]; 66 for(i=0;i<r;i++) 67 for(j=0;j<c;j++) 68 p[i][j]=m.p[i][j]; 69 } 70 return *this; 71 } 72 IntMatrix IntMatrix::operator+(const IntMatrix& m) 73 { 74 if(r!=m.r||c!=m.c) 75 { 76 cout<<"Only homography matrix can be added."<<endl; 77 return *this; 78 } 79 else{ 80 IntMatrix mt(r,c); 81 for(i=0;i<r;i++) 82 for(j=0;j<c;j++) 83 mt.p[i][j]=p[i][j]+m.p[i][j]; 84 return mt; 85 } 86 } 87 IntMatrix::~IntMatrix() 88 { 89 for(i=0;i<c;i++) 90 delete []p[i]; 91 delete []p;//[]p代表p[i],一维数组。 92 cout<<"<the matrix is deleted!>"<<endl; 93 } 94 istream& operator>>(istream& input,IntMatrix& m) 95 { 96 int ir=m.r,ic=m.c; 97 cout<<"Input the elements according to the row:"<<endl; 98 for(i=0;i<ir;i++) 99 for(j=0;j<ic;j++) 100 input>>m.p[i][j]; 101 return input; 102 } 103 ostream& operator<<(ostream& output,const IntMatrix& m) 104 { 105 int outr=m.r,outc=m.c; 106 for(i=0;i<outr;i++) 107 { 108 for(j=0;j<outc;j++) 109 output<<m.p[i][j]<<" "; 110 output<<endl; 111 } 112 return output; 113 } 114 115 //main.cpp 116 #include<iostream> 117 #include "matrix.h" 118 119 using namespace std; 120 121 int main() 122 { 123 int n; 124 cout<<"The order of the Square Matrix:"; 125 cin>>n; 126 IntMatrix m0(n,n); 127 cin>>m0; 128 cout<<"m0:"<<endl; 129 cout<<m0; 130 IntMatrix m1(n,n); 131 m1=m0; 132 cout<<"m1=m0"<<endl<<"m1:"<<endl; 133 cout<<m1; 134 IntMatrix m2(n,n); 135 m2=m0+IntMatrix(n); 136 cout<<"m2=m0+Intmatrix("<<n<<")"<<endl<<"m2:"<<endl; 137 cout<<m2; 138 return 0; 139 }
1.error’iostream’ dose not name a type.
#include<iostream>
using namespace std;
而在matrix.cpp文件中给出关于<<and>>的函数定义,只需写#include"matrix.h"。
- Square_matrix::~Square_matrix(){……}
析构函数无返回值,甚至连空也不是,个这样定义,不写返回类型。
- 前向引用声明。P 119
4.IntMatrix::IntMatrix(const IntMatrix& m)
{
r=m.r;
c=m.c;
delete p;
p=new int*[r];
for(i=0;i<r;i++)
p[i]=new int[c];
for(i=0;i<r;i++)
for(j=0;j<c;j++)
p[i][j]=m.p[i][j];
}
IntMatrix IntMatrix::operator+(const IntMatrix& m)
{
if(r!=m.r||c!=m.c)
{
cout<<"Only homography matrix can be added."<<endl;
return *this;
}
else{
IntMatrix mt(r,c);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
mt.p[i][j]=p[i][j]+m.p[i][j];
return mt;
}
}
Error:Process returned -1073741819 (0xC0000005)
经排查发现是由于复制构造函数出现问题,导致在函数执行过程中发生了内存溢出。
- ostream const&,在<<运算定义时应采用常引用。
6.int i,j;定义为全局变量,可以避免出现未使用变量的警告。
7.加法定义为成员函数还是友元函数。是对同一类进行运算,故定义为成员函数即可。
六、评阅意见
- 类名应为IntMatrix
- 自定义拷贝构造函数实现深复制,虽然没有显式调用,但在函数调用(参数传递)过程中隐式调用。
- 在重载赋值和加法运算时,应注意判断矩阵是否同形,同形才可。
- 类的成员函数定义放在另一个文件里,这样可以更迅速的知道类的成员和功能。