HM107 三种构造三种叫法
HM107 三种构造三种叫法
来源: 第 107 集 类和对象-对象特性-函数的分类以及调用
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
人员类型 Person 只有一个整型年龄。构造函数可以按两种方式分类:
- 按参数: 形参列表为空的是无参构造(也叫默认构造);有形参的是有参构造。
- 按类型: 形如
Person(const Person &other)的是拷贝构造(按引用传入、用const禁止改本体,把对方年龄拷到自身);其余都是普通构造。
调用也有三种写法,必须都能用来创建对象:
- 括号法:
Person p2(10);调有参;Person p3(p2);调拷贝。无参请写成Person p1;。**不要**写成Person p1();——编译器会把它当成函数声明,并不会创建对象。 - 显示法:
Person p2 = Person(10);、Person p3 = Person(p2);。等号右边单独拿出来是匿名对象;匿名对象若没有被起名,**当前语句结束后立刻析构**。不要用拷贝构造去初始化匿名对象:已有对象p3时再写Person(p3);,编译器会当成对象声明Person p3;,造成重定义。 - 隐式转换法:
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\) 编号。
输出格式
每种操作输出若干行,行末换行:
1:BRACKET id x2:DEFAULT id 03:BRACKET_COPY id age4:DISPLAY id x5:DISPLAY_COPY id age6:IMPLICIT id x7:IMPLICIT_COPY id age8:FUNC_DECL9:REDECLARE10:先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
- 通过率
- ?
- 上传者