HM107 三种构造三种叫法

HM107 三种构造三种叫法

HM107 三种构造三种叫法

来源: 第 107 集 类和对象-对象特性-函数的分类以及调用

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

人员类型 Person 只有一个整型年龄。构造函数可以按两种方式分类:

  • 按参数: 形参列表为空的是无参构造(也叫默认构造);有形参的是有参构造。
  • 按类型: 形如 Person(const Person &other) 的是拷贝构造(按引用传入、用 const 禁止改本体,把对方年龄拷到自身);其余都是普通构造。

调用也有三种写法,必须都能用来创建对象:

  1. 括号法: Person p2(10); 调有参;Person p3(p2); 调拷贝。无参请写成 Person p1;。**不要**写成 Person p1();——编译器会把它当成函数声明,并不会创建对象。
  2. 显示法: Person p2 = Person(10);Person p3 = Person(p2);。等号右边单独拿出来是匿名对象;匿名对象若没有被起名,**当前语句结束后立刻析构**。不要用拷贝构造去初始化匿名对象:已有对象 p3 时再写 Person(p3);,编译器会当成对象声明 Person p3;,造成重定义。
  3. 隐式转换法: Person p4 = 10; 等价于 Person p4 = Person(10);Person p5 = p4; 调拷贝构造。

无参构造把年龄写成 \(0\)。处理 \(q\) 次操作,按下面规则创建或报告误用。

输入格式

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

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

  • 1 x:括号法有参,年龄为 \(x\)
  • 2:括号法无参(不要加空括号)
  • 3 i:括号法拷贝编号 \(i\)
  • 4 x:显示法有参,年龄为 \(x\)
  • 5 i:显示法拷贝编号 \(i\)
  • 6 x:隐式转换有参,年龄为 \(x\)
  • 7 i:隐式转换拷贝编号 \(i\)
  • 8:误写成 Person name();,不创建对象
  • 9 i:误用拷贝构造初始化匿名对象(相当于重定义编号 \(i\) 的名字)
  • 10 x:先写匿名对象 Person(x),再执行下一句输出

对象按创建顺序从 \(1\) 编号。

输出格式

每种操作输出若干行,行末换行:

  • 1BRACKET id x
  • 2DEFAULT id 0
  • 3BRACKET_COPY id age
  • 4DISPLAY id x
  • 5DISPLAY_COPY id age
  • 6IMPLICIT id x
  • 7IMPLICIT_COPY id age
  • 8FUNC_DECL
  • 9REDECLARE
  • 10:先 ANON x,再因匿名对象立刻析构输出 DEAD,最后 AFTER

样例

输入 #1

10
1 10
2
3 1
4 20
5 4
6 30
7 6
8
9 1
10 40

输出 #1

BRACKET 1 10
DEFAULT 2 0
BRACKET_COPY 3 10
DISPLAY 4 20
DISPLAY_COPY 5 20
IMPLICIT 6 30
IMPLICIT_COPY 7 30
FUNC_DECL
REDECLARE
ANON 40
DEAD
AFTER

输入 #2

2
6 7
3 1

输出 #2

IMPLICIT 1 7
BRACKET_COPY 2 7

说明

  • 拷贝必须真正把源对象的年龄抄到新对象上,不能在 main 里只抄输入。
  • Person p(); 不是无参对象;无参请去掉括号。
  • 匿名对象没有名字,当前行一结束就被回收,所以 DEAD 一定出现在 AFTER 前面。
  • Person(已有对象); 会被当成对象声明,本题输出 REDECLARE,不要再创建一个同名对象。

信息

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