017 二维数组类

这题没有get到点的话还挺麻烦的。关键在于做一个数组指针的指针。

分析:

1⃣️ Array2 a(3,4); //构造函数,两int型参数,Array2是二维数组形式。

2⃣️ a[i][j] = i * 4 + j;    //a[i][j] 在C++里相当于:a,operator[](i).operator[](j)

      但是用上面说的数组指针的指针则不用这么麻烦,只需重载 “ [ ] ” 即可,详见code。

3⃣️ cout << a(i,j) << ",";   //重载"()",常规操作。

4⃣️  b = a;   //重载 "=",实现深拷贝。

5⃣️  这题不用重载流输入符,因为在 cout<< 这边的都不是类成员变量,是一些类成员函数,在类成员函数里返回能输出的标准值即可。

6⃣️ 常规的复制构造函数(这题用不上,也写写,练手嘛)和析构函数。

完整代码如下:

#include <iostream>
#include <cstring>
using namespace std;

class Array2 {
// 在此处补充你的代码
private:
    int ** p;//数组指针的指针,关键!
    int col,row;
public:
    //构造函数
    Array2(int x = 0, int y = 0):col(x),row(y){
        if( x && y == 0 ) p = NULL;
        else{
            p = new int*[col];
            for(int i = 0; i < col; i++){
                p[i] = new int[row];
            }
        }
    }
    //复制构造函数
    Array2(const Array2 & array2_){
        col = array2_.col;
        row = array2_.row;
        p = new int*[col];
        for(int i = 0; i < col; i++){
            p[i] = new int[row];
        }
        memcpy(p,array2_.p,sizeof(int) * col * row);
    }

    //重载"="实现深拷贝
    Array2 & operator=(const Array2 & array2_){
        if(p) delete []p;
        col = array2_.col;
        row = array2_.row;
        p = new int*[col];
        for(int i = 0; i < col; i++){
            p[i] = new int[row];
        }
        memcpy(p,array2_.p,sizeof(int) * col * row);
        return *this;
    }

    //析构函数
    ~Array2(){
        if(p) delete []p;
    }

    //重载"[]"
    int * operator[](int i){
        return p[i];
        //重载的是 a[][]的第一个[] ,因为返回的是p[x],则第二个[]相当于取p[x]的第y个。
    }

    //重载"()"
    int & operator()(int x, int y){ //重载()
        return p[x][y];
    }

};

int main() {
    Array2 a(3,4); //构造函数,两int型参数,Array2是二维数组形式。
    int i,j;
    for(  i = 0;i < 3; ++i )
        for(  j = 0; j < 4; j ++ )
            a[i][j] = i * 4 + j;
            //a[i][j] 在C++里相当于:a,operator[](i).operator[](j)
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << a(i,j) << ","; //重载"()"
        }
        cout << endl;
    }
    cout << "next" << endl;
    Array2 b;
    b = a; //重载 "=",实现深拷贝。
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << b[i][j] << ",";
        }
        cout << endl;
    }
    return 0;
}

 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值