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\)。
输出格式
1:CREATE id a h2:CLONE id a h3:一行两个整数,年龄和身高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
- 通过率
- ?
- 上传者