运算符重载

一、实验目的:

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"。

  1. Square_matrix::~Square_matrix(){……}

析构函数无返回值,甚至连空也不是,个这样定义,不写返回类型。

  1. 前向引用声明。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)

经排查发现是由于复制构造函数出现问题,导致在函数执行过程中发生了内存溢出。

  1. ostream const&,在<<运算定义时应采用常引用。

6.int i,j;定义为全局变量,可以避免出现未使用变量的警告。

7.加法定义为成员函数还是友元函数。是对同一类进行运算,故定义为成员函数即可。

六、评阅意见

  1. 类名应为IntMatrix
  2. 自定义拷贝构造函数实现深复制,虽然没有显式调用,但在函数调用(参数传递)过程中隐式调用。
  3. 在重载赋值和加法运算时,应注意判断矩阵是否同形,同形才可。
  4. 类的成员函数定义放在另一个文件里,这样可以更迅速的知道类的成员和功能。

 

上一篇:Java程序-单链表增删改查(实现对水浒人物的增删改查操作)


下一篇:实验——运算符重载(方阵和单位阵的混合运算)