HM094 常量引用防误改
HM094 常量引用防误改
来源: 第 94 集 C++中的引用-常量引用
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
普通引用必须绑到一块合法内存(栈上或堆上的变量)。把 int &alias = 10 这样的字面量直接绑上去是非法的:字面量在常量区,不是可以随便起别名的可写空间。
写成常量引用 const int &alias = 10 就合法了。并不是字面量自己变成了变量,而是编译器先造出一个值为 \(10\) 的临时量,再让引用去绑这块临时内存。加上 const 后,别名进入只读状态,不能再通过它改值。
常量引用的主要用途是修饰函数形参,防止误操作。打印函数本来只该输出形参;若形参写成 int &value,函数体里误把 value 改成 \(1000\),实参也会一起被改掉(别名和原名同一块内存)。把形参改成 const int &value 后,函数体内再写赋值就是非法操作,实参保持原值。
现有长度为 \(n\) 的整数仓库(下标从 \(1\) 开始)。处理 \(q\) 次操作:
1 i:用常量引用只读打印仓库第 \(i\) 个数,输出READ x。2 i v:试图通过常量引用把仓库第 \(i\) 个数改成 \(v\)。这是只读限定下的误操作,输出READONLY,仓库不变。3 v:用常量引用绑定值为 \(v\) 的字面量(编译器生成临时量),输出TEMP v。4 v:用普通引用绑定字面量 \(v\)。这不合法,输出INVALID。5 i:调用非常量引用版打印函数。函数体误把形参改成 \(1000\) 再打印,输出PRINT 1000,仓库第 \(i\) 个数变成 \(1000\)。6 i:调用常量引用版打印函数,只输出PRINT x,仓库不变。
输入格式
第一行两个整数 \(n\)、\(q\)(\(1 \le n,q \le 1000\))。
第二行 \(n\) 个整数 \(a_1, a_2, \ldots, a_n\)(\(-10^9 \le a_i \le 10^9\))。
接下来 \(q\) 行,每行一次操作,格式见题目描述。其中 \(1 \le i \le n\),\(v\) 为整数且 \(-10^9 \le v \le 10^9\)。
输出格式
对每次操作输出恰好一行,行末换行。格式见题目描述。
样例
输入 #1
3 6
100 20 7
6 1
5 1
1 1
4 10
3 10
2 2 99
输出 #1
PRINT 100
PRINT 1000
READ 1000
INVALID
TEMP 10
READONLY
输入 #2
1 2
5
3 8
6 1
输出 #2
TEMP 8
PRINT 5
说明
- 普通引用不能绑字面量;常量引用可以,因为编译器生成了临时量。
- 常量引用只读,不能通过别名改原值,因此操作
2不会改仓库。 - 操作
5用引用传参,形参被改成 \(1000\) 后实参同步变成 \(1000\)。 - 操作
6的形参带const,只能打印,不能改实参。
信息
- ID
- 1093
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者