#include <iostream>
#include <cstring>
using namespace std;
class Array2 {
public:
int **data = nullptr;
int h, w;
Array2():h(0),w(0) {}
//1、数组创建和回收
//创建时,通过先分配每一个下标的N个指针,现为对应的每个指针分配相应的内存;
//回收时,对应的回收内在的时候需要反过来回收;
Array2(int height, int width):h(height),w(width)
{
data = new int*[height];
for (int i = 0; i<height; i++)
{
data[i] = new int[width];
}
}
int &operator()(int i, int j)
{
return data[i][j];
}
//2、[]的重载,它只能有一个参数
//如果括号里有两个参数,像这样 (int i,int j)会报错,提示只能有一个。不知为何
//这里为什么只返回data[i]就行了呢?因为data[i]相当于数组名,返回去之后其实是这样的(data[i])[j]
int *operator[](int i)
{
return data[i];
}
//3、赋值运算符的重载
//这里如果不返回引用,那么返回的值将会赋值给一个临时对象c。c的东西就是调用了默认复制构造函数,复制*this所得到的。
//而默认构造函数对指针不复制?是浅拷贝,所以只是h和w进行了复制,data根本连复制都没有,都不能算浅拷贝,就是不拷贝。
//如果返回引用的话,就不用调用复制构造函数了!!!!
Array2& operator=(const Array2 &rhs)
{
if (this == &rhs)
return *this;
if(data)
{
for (int i = 0; i<h; i++)
delete[]data[i];
delete[]data;
}
h = rhs.h;
w = rhs.w;
data = new int*[h];
for (int i = 0; i<h; i++)
{
data[i] = new int[w];
}
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
data[i][j] = rhs.data[i][j];
return *this;
}
~Array2()
{
for(int i=0;i<h;i++)
delete []data[i];
delete[]data;
}
};
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;
}