C++實現二位數組加減法

爲了深入理解C++中拷貝構造函數、賦值運算符、運算符重載、動態內存分配new,寫了一個實現數組加法的類。雖然該程序實現的功能比較簡單,但是卻包含了不少難點和初學者容易忽視的地方。

//class.h

#include <stdlib.h>
#include <iostream>
using namespace std;

class matrix{

public:
    const int row,col;
    int **ptr;
    matrix(int x=2,int y=3): row(x),col(y){
        ptr = new int *[row];
        for(int i=0;i<row;i++)
            ptr[i] = new int[col];
            cout<<"constructor"<<endl;
    }

    matrix(const matrix& a):row(a.row),col(a.col){
         ptr = new int *[a.row];
        for(int i=0;i<a.row;i++)
            ptr[i] = new int[a.col];

        for(int i=0;i<a.row;i++)
            for(int j=0;j<a.col;j++)
                ptr[i][j] = a.ptr[i][j];
        cout<<"copy constructor"<<endl;
    }
    matrix operator+(const matrix &b)const{
        matrix sum(b);
        for(int i=0;i<b.row;i++)
            for(int j=0;j<b.col;j++)
                sum.ptr[i][j] = ptr[i][j] + b.ptr[i][j];
        return sum;
    }

    void operator=(matrix &&a){
        cout << "assignment operator function"<<endl;
        if(this != &a){
         for(int i=0;i<a.row;i++)
            for(int j=0;j<a.col;j++)
                ptr[i][j] = a.ptr[i][j];
        }

    }
    ~matrix(){
        cout << ptr[1][2] <<" destroct function"<<endl;
        for(int i=0;i<row;i++)
        delete [] ptr[i];
        delete [] ptr;
    }
};

//main.c

#include <iostream>
#include "matrix.h"
using namespace std;


int main()
{
    matrix a,b,sum;

    for(int i=0;i<a.row;i++){
        for(int j=0;j<a.col;j++)
        {
            a.ptr[i][j] = i;
            b.ptr[i][j] = j;
        }
    }

    sum = a + b;
    cout<<"a arr"<<endl;
    for(int i=0;i<sum.row;i++){
        for(int j=0;j<sum.col;j++)
        {
            cout<<a.ptr[i][j]<<ends;
        }
        cout<<endl;
    }
    cout<<"b arr"<<endl;
    for(int i=0;i<sum.row;i++){
        for(int j=0;j<sum.col;j++)
        {
            cout<<b.ptr[i][j]<<ends;
        }
        cout<<endl;
    }
    cout<<"c arr"<<endl;
    for(int i=0;i<sum.row;i++){
        for(int j=0;j<sum.col;j++)
        {
            cout<<sum.ptr[i][j]<<ends;
        }
        cout<<endl;
    }
    cout << "Hello world!" << endl;
    return 0;
}

輸出結果:



難點:

通過重載加法運算符實現兩個矩陣的加法運算,該重載運算符函數返回值必定爲matrix類型,因爲該返回值要賦值給sum對象,因此係統必定生成一個返回值的副本,用來賦值給sum對象。因此編譯器會調用拷貝構造函數,根據該返回值拷貝構造一個臨時temp對象,然後sum再調用它的重載賦值運算符,將temp對象賦值給自己。

改程序應該注意一下幾點:

1)必須爲類定義拷貝構造函數和重載賦值運算符

2)定義重載賦值運算符時函數參數應該爲右值引用左值引用兩個版本,因爲調用重載的加法運算符後的返回值是個右值,必須通過右值引用來引用該返回值;如果將一個已存在的對象賦值給sum對象,則編譯器選擇調用左值引用的重載賦值運算符(這裏偷懶沒有定義左值引用參數啊)。

3)賦值運算符必須執行深度複製,而不是淺複製

4)二維數組用new如何生成,以及如何釋放二維數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章