004:第四周程序填空题3

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值