HM108 拷贝出现的三种时候
HM108 拷贝出现的三种时候
来源: 第 108 集 类和对象-对象特性-拷贝构造函数调用时机
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
人员类型 Person 有年龄。除了无参构造、有参构造和析构,必须自己写拷贝构造 Person(const Person &other),把对方年龄拷到自身。
拷贝构造通常在三种时机被调用:
- 用已经创建好的对象初始化新对象:
Person p2(p1);,新对象拿到 \(p1\) 的年龄。 - 值传递给函数参数:
void doWork(Person p)。实参会克隆出临时副本;在副本上改年龄,不会改到原来的对象。 - 按值返回局部对象: 函数里先构造局部人员,再
return它。外面收到的是一份新对象(编号不同),年龄与局部对象相同。本题以新对象的编号和年龄为准,不依赖是否发生拷贝消除。
处理 \(q\) 次操作。对象按创建顺序从 \(1\) 编号。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一个操作(年龄绝对值不超过 \(10^9\),保证用到的编号已存在):
1 x:有参构造,年龄为 \(x\)2 i:用编号 \(i\) 初始化新对象(时机 1)3 i x:把编号 \(i\) 值传进doWork,把副本年龄改成 \(x\)(时机 2)4 x:函数内局部构造年龄 \(x\),按值返回并用返回值初始化新对象(时机 3)
输出格式
1:CREATE id x2:INIT id age3:PASS origAge x(第一个数是原对象年龄,必须仍是改之前的值)4:RETURN id x
每行末换行。
样例
输入 #1
5
1 20
2 1
3 1 1000
4 20
1 18
输出 #1
CREATE 1 20
INIT 2 20
PASS 20 1000
RETURN 3 20
CREATE 4 18
输入 #2
3
1 7
3 1 0
2 1
输出 #2
CREATE 1 7
PASS 7 0
INIT 2 7
说明
- 时机 2 必须真正按值传入对象:改副本之后再读原对象,年龄不能变。
- 时机 1 与时机 3 得到的都是新编号,但年龄与来源相同。
- 不要打印对象地址。
信息
- ID
- 1107
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者