HM109 写了谁就不给谁
HM109 写了谁就不给谁
来源: 第 109 集 类和对象-对象特性-构造函数调用规则
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
只要写出一个类,编译器至少会补上三个函数:默认构造(空实现)、析构(空实现)、拷贝构造(把每个属性做一次等号赋值,也叫值拷贝)。你不写,它也写。
调用规则有两条:
- 只写了有参构造: 编译器不再提供无参(默认)构造,但**仍然提供**拷贝构造。此时
Person p;非法,Person p2(p1);仍然合法,副本年龄等于源对象。 - 只写了拷贝构造: 编译器不再提供其他普通构造(无参、有参都不给)。此时既不能
Person p;,也不能Person p(18);。
请同时实现三类人员:
Plain:自己不写任何构造。默认构造后写入年龄,再拷贝,副本必须拿到同一年龄(编译器默认拷贝是值拷贝)。改原对象不会改副本。ParamOnly:只写有参构造。无参请求输出NO_DEFAULT;有参后再拷贝,输出副本年龄。CopyOnly:只写拷贝构造。无参输出NO_DEFAULT,有参输出NO_PARAM。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一个操作(年龄绝对值不超过 \(10^9\)):
1 x:Plain默认构造,写入年龄 \(x\),再拷贝,输出副本年龄2 x:ParamOnly有参构造年龄 \(x\),再拷贝,输出副本年龄3:对ParamOnly请求无参构造4:对CopyOnly请求无参构造5:对CopyOnly请求有参构造6 x y:Plain写入 \(x\) 并拷贝,再把原对象改成 \(y\),输出副本年龄和原对象当前年龄
输出格式
1/2:一行一个整数,即副本年龄3/4:一行NO_DEFAULT5:一行NO_PARAM6:一行两个整数,副本年龄和改过之后的原对象年龄,中间一个空格
行末换行。
样例
输入 #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
- 通过率
- ?
- 上传者