HM094 常量引用防误改

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
通过率
?
上传者