HM113 一份数据两种叫法
HM113 一份数据两种叫法
来源: 第 113 集 30&31 类和对象-静态成员
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
成员前面加上 static 就变成静态成员。静态成员不属于某一个对象,分静态成员变量和静态成员函数两类。
静态成员变量有三条性质:
- 所有对象共享同一份数据。甲改成 \(200\),乙再读也是 \(200\)。
- 编译阶段就在全局区分配内存,不是创建对象时才分配。
- 必须**类内声明、类外初始化**,写成
int Person::mA = 100;。类外不要再写static,但要加作用域。
它有两种访问方式:通过对象 p.mA,或通过类名 Person::mA。它也有访问权限:写在 private 里的静态变量,类外用对象或类名都读不到。
静态成员函数同样被所有对象共享,也可以用对象或类名调用。它**只能访问静态成员变量**,不能访问非静态成员:函数体里分不清要改的是哪个对象的那份数据。私有静态成员函数类外也调不到。
请实现 Person:公有静态整数 mA(类外初值 \(100\))、非静态整数 mB、公有静态函数 func(只能改 mA)、私有静态整数 mC(类外初值 \(200\))、私有静态函数 func2。处理 \(q\) 次操作。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一个操作(\( |v| \le 10^9\)):
1:用对象读取mA2:用类名读取mA3 v:对象 \(p2\) 把mA写成 \(v\),再用另一个对象 \(p1\) 读出来4 v:用类名把mA写成 \(v\),再用对象读出来5:类外访问私有静态变量mC6 v:用对象调用func,把mA写成 \(v\)7 v:用类名调用func,把mA写成 \(v\)8:静态函数试图改非静态mB9:类外调用私有静态函数func2
输出格式
1:OBJ x2:CLASS x3:SHARE x4:CLASS_SET x5/8/9:DENIED6:FUNC_OBJ x7:FUNC_CLASS x
其中 \(x\) 为当前共享的 mA。行末换行。
样例
输入 #1
9
1
2
3 200
4 300
5
6 400
7 500
8
9
输出 #1
OBJ 100
CLASS 100
SHARE 200
CLASS_SET 300
DENIED
FUNC_OBJ 400
FUNC_CLASS 500
DENIED
DENIED
输入 #2
3
2
3 0
1
输出 #2
CLASS 100
SHARE 0
OBJ 0
说明
mA的初值必须写在类外;不初始化就无法解析这份外部数据。- 一个对象改
mA,另一个对象读到的是同一份。 - 静态函数可以改
mA,但不能改mB。 - 私有静态成员无论变量还是函数,类外都访问不到。
信息
- ID
- 1112
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者