HM124 堆上年龄深拷贝
HM124 堆上年龄深拷贝
来源: 第 124 集 类和对象-C++运算符重载-赋值运算符重载
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
编译器给一个类默认提供四个函数:默认构造、默认析构、拷贝构造,以及 operator=。默认的赋值和拷贝构造都是属性的值拷贝。若成员是堆区指针,值拷贝只复制地址,析构时同一块堆内存会被释放两次,程序崩溃。
请实现人员类型 Person:
- 年龄不直接存
int,而存int*。构造时new int(年龄),由指针维护堆区数据。 - 析构时若指针非空,先
delete再置空,由程序员手动释放堆区。 - 重载
operator=:先判断是不是自己赋给自己,是则直接返回,避免先释放再读已经释放的内存;否则若自身已有堆区数据,先释放干净,再new一块新内存,把对方年龄拷进去(深拷贝)。 - 函数返回
Person&(return *this),才能写p3 = p2 = p1这种连等。返回void无法连等;返回值会多一次拷贝,不是对象自身。
读入若干人的年龄和若干次赋值。赋值必须走重载后的 operator=。最后按编号输出每人当前年龄。
输入格式
第一行一个整数 \(n\)(\(1 \le n \le 1000\)),表示人数。
第二行 \(n\) 个整数 \(a_i\)(\(1 \le a_i \le 150\)),第 \(i\) 个人的初始年龄。编号从 \(1\) 开始。
第三行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一种赋值:
A i j:执行 \(p_i = p_j\)C i j k:执行 \(p_i = p_j = p_k\)(连等,从右向左)
保证编号合法。允许 \(i=j\)(自赋值)。
输出格式
一行 \(n\) 个整数,依次为操作全部完成后每个人的年龄,数与数之间一个空格,行末换行。年龄必须从堆区指针解引用得到。
样例
输入 #1
3
18 20 30
2
A 2 1
C 3 2 1
输出 #1
18 18 18
输入 #2
2
18 20
2
A 1 1
A 2 2
输出 #2
18 20
说明
- 默认赋值会让两个指针指向同一块堆内存,析构时重复释放。必须先清空自身旧堆区,再新开堆区拷贝数值。
- 自赋值必须直接返回,不能先
delete自己再去读对方。 - 样例 #1:先 \(p_2=p_1\),再 \(p_3=p_2=p_1\),三人都是 \(18\)。
- 样例 #2:自己赋给自己,年龄保持不变。
信息
- ID
- 1123
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者