HM108 拷贝出现的三种时候

HM108 拷贝出现的三种时候

HM108 拷贝出现的三种时候

来源: 第 108 集 类和对象-对象特性-拷贝构造函数调用时机

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

人员类型 Person 有年龄。除了无参构造、有参构造和析构,必须自己写拷贝构造 Person(const Person &other),把对方年龄拷到自身。

拷贝构造通常在三种时机被调用:

  1. 用已经创建好的对象初始化新对象: Person p2(p1);,新对象拿到 \(p1\) 的年龄。
  2. 值传递给函数参数: void doWork(Person p)。实参会克隆出临时副本;在副本上改年龄,不会改到原来的对象。
  3. 按值返回局部对象: 函数里先构造局部人员,再 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)

输出格式

  • 1CREATE id x
  • 2INIT id age
  • 3PASS origAge x(第一个数是原对象年龄,必须仍是改之前的值)
  • 4RETURN 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
通过率
?
上传者