HM110 堆上身高不能共指针

HM110 堆上身高不能共指针

HM110 堆上身高不能共指针

来源: 第 110 集 类和对象-对象特性-深拷贝与浅拷贝

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

人员类型 Person 有两个属性:整型年龄 mAge,以及指向堆区身高的指针 mHeight。有参构造必须 new int(height) 把身高放进堆里,让指针指向这块内存。

析构时如果指针非空,要 delete 掉堆内存,再把指针置空。堆区数据由程序员开辟,也由程序员在对象销毁前释放。

如果只靠编译器默认拷贝构造,它会对指针做**浅拷贝**(简单等号赋值)。两个对象会指向同一块堆内存。栈上对象后创建的先析构,先被释放的那个 delete 之后,另一个再 delete 就是重复释放。

因此只要属性里有堆区内存,就必须自己写拷贝构造做**深拷贝**:重新 new 一块堆内存,把 *other.mHeight 拷进去。两个指针指向不同地址,数值相同,析构时各释放各的。

处理 \(q\) 次操作。对象按创建顺序从 \(1\) 编号,直到程序结束才析构。

输入格式

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

接下来 \(q\) 行,每行一个操作(年龄、身高绝对值不超过 \(10^9\),保证编号已存在):

  • 1 a h:有参构造,年龄 \(a\)、身高 \(h\)
  • 2 i:用自己写的深拷贝构造,从编号 \(i\) 克隆出新对象
  • 3 i:输出编号 \(i\) 的年龄和身高(身高要解引用)
  • 4 i x:把编号 \(i\) 的身高改成 \(x\)(只改这一份堆内存)

开辟次数不超过 \(1000\)。

输出格式

  • 1CREATE id a h
  • 2CLONE id a h
  • 3:一行两个整数,年龄和身高
  • 4:一行一个整数,修改后的身高

行末换行。

样例

输入 #1

6
1 18 160
2 1
3 1
3 2
4 2 170
3 1

输出 #1

CREATE 1 18 160
CLONE 2 18 160
18 160
18 160
170
18 160

输入 #2

3
1 20 175
4 1 180
3 1

输出 #2

CREATE 1 20 175
180
20 180

说明

  • 样例 #1 把副本身高改成 \(170\) 后,原对象仍是 \(160\),说明两块堆内存不是同一块。
  • 必须真正 new / delete,不能只把身高存在普通整型成员里冒充。
  • 不要输出指针地址。

信息

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