//D:二维数组类
#include <iostream>
#include <cstring>
using namespace std;
class Array2 {
// 在此处补充你的代码
private:
int** p;//二维数组两颗星
//助教大哥说可以只开一维数组,like a line
int col, row;
public:
//构造函数
Array2(int x=0, int y=0) :col(x), row(y)
//这里初始化0太关键了,这样定义对象b时就不用再写一个无参构造函数
{
if (x && y == 0)
p = NULL;
else {
p = new int* [col];//没有new int**[][]的写法
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];
}
int& operator()(int x, int y) {
return p[x][y];
}
};
int main() {
Array2 a(3, 4);
int i, j;
for (i = 0; i < 3; ++i)
for (j = 0; j < 4; j++)
a[i][j] = i * 4 + 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;
}
/*输入
无
输出
0,1,2,3,
4,5,6,7,
8,9,10,11,
next
0,1,2,3,
4,5,6,7,
8,9,10,11,
样例输入
None
样例输出
0,1,2,3,
4,5,6,7,
8,9,10,11,
next
0,1,2,3,
4,5,6,7,
8,9,10,11,*/