• 实验七


    实验目的: (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

    注意:重载+运算符为友元函数需要在函数里开辟一个临时的对象temp,但这个对象在函数调用结束后会被销毁。所以重载的=以及<<右边的操作数必须声明为const的引用,否则会报错:||=== Build: Debug in 实验七 (compiler: GNU GCC Compiler) ===|
    error: invalid initialization of non-const reference of type 'IntMatrix&' from an rvalue of type 'IntMatrix'

    matrix.h

    #ifndef MATRIX_H_INCLUDED
    #define MATRIX_H_INCLUDED
    #include <iostream>//不加的话ostream会报错但istream不会
    using namespace std;
    class IntMatrix
    {
    public:
        IntMatrix(int r,int c);
        IntMatrix(int n);
        void Show();
        friend IntMatrix operator+(const IntMatrix &,const IntMatrix &); //对称性的运算符重载为友元函数
        friend ostream& operator<<(ostream &, const IntMatrix &);//=的重载和<<重载对接的参数类型一定要匹配
        friend istream& operator>>(istream &, IntMatrix &);
        IntMatrix & operator=(const IntMatrix & m);//注意是引用类型
        int getRow();
        int getCol();
        ~IntMatrix();
    private:
        int **p;
        int row;
        int col;
    };
    
    #endif // MATRIX_H_INCLUDED

    matrix.cpp

    #include "matrix.h"
    #include <iostream>
    using namespace std;
    IntMatrix::IntMatrix(int r,int c)
    {
        int i,j;
        row=r;//别忘记把r,c也传进去
        col=c;
        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]=0;
            }
        }
    }
    IntMatrix::IntMatrix(int n)
    {
        int i,j;
        row=n;//别忘记把r,c也传进去
        col=n;
        p = new int *[n];
        for(i=0;i<n;i++) p[i]=new int [n];
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                p[i][j]=(i==j)?1:0;
            }
        }
    
    }
    int IntMatrix::getRow()
    {
        return this->row;
    }
    int IntMatrix::getCol()
    {
        return this->col;
    }
    istream& operator>>(istream & input,IntMatrix & m)
    {
        cout<<"The row of matrix is "<<m.row<<" and the column of the matrix is "<<m.col<<endl;
        cout<<"Plz input the correct number of row and col"<<endl;
        int i,j;
        for(i=0;i<m.row;i++)
        {
            for(j=0;j<m.col;j++)
            {
                input>>m.p[i][j];
            }
        }
    }
    ostream& operator<<(ostream & output,const IntMatrix & m)//如果打成>>会报错row是private的 很神奇
    {
        cout<<"The row of matrix is "<<m.row<<" and the column of the matrix is "<<m.col<<endl;
        int i,j;
        for(i=0;i<m.row;i++)
        {
            for(j=0;j<m.col;j++)
            {
                output<<m.p[i][j]<<' ';
            }
            cout<<endl;
        }
    }
    IntMatrix operator+(const IntMatrix & A,const IntMatrix & B)
    {
        IntMatrix temp(A.row,A.col);
        int i,j;
        if(A.row!=B.row || A.col!=B.col)
        {
            cout<<"Can't add!"<<endl;
        }
        else
        {
            for(i=0;i<A.row;i++)
            {
                for(j=0;j<A.col;j++)
                {
                    temp.p[i][j]=A.p[i][j]+B.p[i][j];
                }
            }
        }
        return temp;
    }
    IntMatrix & IntMatrix::operator=(const IntMatrix & m)//注意这一行写法
    {
        if(this==&m) return *this;//先判断是否相同
        IntMatrix temp(row,col);
        int i,j;
        if(row!=m.row || col!=m.col)
        {
            cout<<"Wrong!"<<endl;
        }
        else
        {
            for(i=0;i<row;i++)
            {
                for(j=0;j<col;j++)
                {
                    p[i][j]=m.p[i][j];
                }
            }
        }
        return *this;
    }
    void IntMatrix::Show()
    {
        int i,j;
        for(i=0;i<row;i++)
        {
            for(j=0;j<col;j++)
            {
                cout<<p[i][j]<<' ';
            }
            cout<<endl;
        }
    }
    IntMatrix::~IntMatrix()
    {
        int i;
        for(i=0; i<row; i++)   delete [] p[i];
        delete [] p;
    }

    main.cpp

    #include <iostream>
    #include "matrix.h"
    using namespace std;
    
    int main()
    {
        IntMatrix m(3);
        IntMatrix m1(3);
        IntMatrix m2(3,3);
        cin>>m2;
        cout<<m2+m;
        m=m1+IntMatrix(3);
        cout<<m;
        m1=m2;
        cout<<m1;
        return 0;
    }
  • 相关阅读:
    经常使用的两个清爽的table样式
    wdcp新开站点或绑定域名打不开或无法访问的问题
    在线客服代码,可以用
    $smarty获取变量get,post等用法
    mysql 替换某个字段中的某个字符
    git 设置不需要输入密码
    linux批量查找文件内容
    使用PHP QR Code生成二维码
    RabbitMQ-2
    RabbitMQ-1
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/12886852.html
Copyright © 2020-2023  润新知