HM109 写了谁就不给谁

HM109 写了谁就不给谁

HM109 写了谁就不给谁

来源: 第 109 集 类和对象-对象特性-构造函数调用规则

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

只要写出一个类,编译器至少会补上三个函数:默认构造(空实现)、析构(空实现)、拷贝构造(把每个属性做一次等号赋值,也叫值拷贝)。你不写,它也写。

调用规则有两条:

  1. 只写了有参构造: 编译器不再提供无参(默认)构造,但**仍然提供**拷贝构造。此时 Person p; 非法,Person p2(p1); 仍然合法,副本年龄等于源对象。
  2. 只写了拷贝构造: 编译器不再提供其他普通构造(无参、有参都不给)。此时既不能 Person p;,也不能 Person p(18);

请同时实现三类人员:

  • Plain:自己不写任何构造。默认构造后写入年龄,再拷贝,副本必须拿到同一年龄(编译器默认拷贝是值拷贝)。改原对象不会改副本。
  • ParamOnly:只写有参构造。无参请求输出 NO_DEFAULT;有参后再拷贝,输出副本年龄。
  • CopyOnly:只写拷贝构造。无参输出 NO_DEFAULT,有参输出 NO_PARAM

输入格式

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

接下来 \(q\) 行,每行一个操作(年龄绝对值不超过 \(10^9\)):

  • 1 xPlain 默认构造,写入年龄 \(x\),再拷贝,输出副本年龄
  • 2 xParamOnly 有参构造年龄 \(x\),再拷贝,输出副本年龄
  • 3:对 ParamOnly 请求无参构造
  • 4:对 CopyOnly 请求无参构造
  • 5:对 CopyOnly 请求有参构造
  • 6 x yPlain 写入 \(x\) 并拷贝,再把原对象改成 \(y\),输出副本年龄和原对象当前年龄

输出格式

  • 1 / 2:一行一个整数,即副本年龄
  • 3 / 4:一行 NO_DEFAULT
  • 5:一行 NO_PARAM
  • 6:一行两个整数,副本年龄和改过之后的原对象年龄,中间一个空格

行末换行。

样例

输入 #1

6
1 18
2 28
3
4
5
6 18 99

输出 #1

18
28
NO_DEFAULT
NO_DEFAULT
NO_PARAM
18 99

输入 #2

2
1 0
6 7 8

输出 #2

0
7 8

说明

  • 默认构造和析构的函数体是空的;编译器提供的拷贝只做成员赋值。
  • 样例 #1 第一行:即使不手写拷贝构造,副本年龄也是 \(18\)。
  • 样例 #1 最后一行:值拷贝后两边独立,原对象改成 \(99\),副本仍是 \(18\)。
  • 写了有参就没有默认构造;写了拷贝就不再提供其他构造。

信息

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