HM183 深拷贝柜

HM183 深拷贝柜

HM183 深拷贝柜

来源: 第 183 集 模板-类模板案例-数组类封装(上)

难度: 普及-

时间限制: 1s

空间限制: 64MB

题目描述

继续实现通用数组 MyArray<T>。声明和实现写在同一份代码里(类模板不要拆成只含声明的 .h 加另一份 .cpp)。内部:T *pAddress 指向堆区,mCapacity 为容量,mSize 为元素个数。

本题先把「能安全创建、复制、赋值、销毁」做对:

  1. 有参构造 MyArray(int capacity):记下容量,大小置 \(0\),pAddress = new T[capacity]
  2. 析构:若指针非空,delete[] 释放(数组要用带 [] 的 delete),再把指针置空,防止野指针。
  3. 拷贝构造:不能把指针直接赋值。按对方容量重新 new 一块堆内存,再把已有元素逐个拷过来。
  4. operator=:返回 MyArray &(支持 a = b = c 这种连等)。若自身堆区已有数据,先 delete[] 再置空,容量和大小先清零,再按对方做深拷贝,最后 return *this

编译器默认的拷贝和赋值是浅拷贝:两个对象指向同一块堆,析构会崩。必须自己写深拷贝。

为了验证拷贝后互不影响,再提供尾插(满员忽略)和返回引用的 operator[],以及 getCapacity()getSize()

读入柜 \(A\) 的容量和若干整数并尾插;用拷贝构造得到柜 \(B\);把 \(A[0]\) 加上 \(\Delta\)(\(A\) 为空则跳过);再创建容量为 \(c_3\) 的柜 \(C\),执行 C = A(先丢掉 \(C\) 原来的大块堆内存)。再执行 D = C 检验返回引用。输出四只柜子的容量、大小和元素。

输入格式

第一行两个整数 \(c_1, n\)(\(1 \le c_1 \le 1000\),\(0 \le n \le 1000\))。

第二行 \(n\) 个整数,绝对值 \(\le 10^9\)。

第三行一个整数 \(\Delta\)(\(\lvert \Delta\rvert \le 10^9\))。

第四行一个整数 \(c_3\)(\(1 \le c_3 \le 1000\))。

输出格式

四行,依次为 \(A,B,C,D\),格式:

cap= 容量 size= 大小 : 元素(元素之间一个空格;大小为 \(0\) 时冒号后为空)。

样例

输入 #1

5 3
10 20 30
1
100

输出 #1

cap=5 size=3 : 11 20 30
cap=5 size=3 : 10 20 30
cap=5 size=3 : 11 20 30
cap=5 size=3 : 11 20 30

输入 #2

2 0
5
8

输出 #2

cap=2 size=0 :
cap=2 size=0 :
cap=2 size=0 :
cap=2 size=0 :

说明

样例 1:\(B\) 拷贝自修改前的 \(A\),所以仍是 10 20 30;\(A[0]\) 加 \(1\) 变成 \(11\) 不影响 \(B\)。\(C\) 原先容量 \(100\),赋值后容量变成 \(5\)。\(D = C\) 能成立是因为赋值返回了自身引用。\(n=0\) 时没有元素行。

信息

ID
1182
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者