HM183 深拷贝柜
HM183 深拷贝柜
来源: 第 183 集 模板-类模板案例-数组类封装(上)
难度: 普及-
时间限制: 1s
空间限制: 64MB
题目描述
继续实现通用数组 MyArray<T>。声明和实现写在同一份代码里(类模板不要拆成只含声明的 .h 加另一份 .cpp)。内部:T *pAddress 指向堆区,mCapacity 为容量,mSize 为元素个数。
本题先把「能安全创建、复制、赋值、销毁」做对:
- 有参构造
MyArray(int capacity):记下容量,大小置 \(0\),pAddress = new T[capacity]。 - 析构:若指针非空,
delete[]释放(数组要用带[]的 delete),再把指针置空,防止野指针。 - 拷贝构造:不能把指针直接赋值。按对方容量重新
new一块堆内存,再把已有元素逐个拷过来。 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
- 通过率
- ?
- 上传者