HM124 堆上年龄深拷贝

HM124 堆上年龄深拷贝

HM124 堆上年龄深拷贝

来源: 第 124 集 类和对象-C++运算符重载-赋值运算符重载

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

编译器给一个类默认提供四个函数:默认构造、默认析构、拷贝构造,以及 operator=。默认的赋值和拷贝构造都是属性的值拷贝。若成员是堆区指针,值拷贝只复制地址,析构时同一块堆内存会被释放两次,程序崩溃。

请实现人员类型 Person

  1. 年龄不直接存 int,而存 int*。构造时 new int(年龄),由指针维护堆区数据。
  2. 析构时若指针非空,先 delete 再置空,由程序员手动释放堆区。
  3. 重载 operator=:先判断是不是自己赋给自己,是则直接返回,避免先释放再读已经释放的内存;否则若自身已有堆区数据,先释放干净,再 new 一块新内存,把对方年龄拷进去(深拷贝)。
  4. 函数返回 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
通过率
?
上传者