HM114 只有普通成员算在对象上

HM114 只有普通成员算在对象上

HM114 只有普通成员算在对象上

来源: 第 114 集 类和对象-对象特性-成员变量和成员函数分开存储

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

封装把属性和行为看成一个整体,但它们在对象模型里是分开存的。结论只有一句:**只有非静态成员变量属于类的对象**;静态成员变量、静态成员函数、非静态成员函数都不属于某一个对象,各自在全程序里只有一份。

空类实例化出来的空对象也要占一块独一无二的位置,否则两个空对象会叠在同一处。本题用「占用单元」计数,不考察某个类型占几个字节:

  • 一个非静态成员变量都没有时,占用单元为 \(1\)(占位)。
  • 一旦有了 \(k\) 个非静态成员变量,占用单元就是 \(k\)(不再额外加那个空对象占位)。

静态成员变量必须类内声明、类外初始化,并且所有对象共享同一份,可以用对象或类名访问。

处理 \(q\) 次操作。

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 1000\))。

接下来 \(q\) 行,每行一个操作(\( |v| \le 10^9\),\(0 \le k \le 1000\)):

  • 0:空类占用单元
  • 1 k:有 \(k\) 个非静态整型成员时的占用单元
  • 2 x:询问第 \(x\) 种成员是否属于对象。\(x=1\) 非静态成员变量,\(x=2\) 静态成员变量,\(x=3\) 非静态成员函数,\(x=4\) 静态成员函数
  • 3:创建两个空对象,判断它们是否占不同位置
  • 4 v:把共享的静态成员 Demo::mB 写成 \(v\)
  • 5:另造一个 Demo 对象读 mB

输出格式

  • 0 / 1:一行一个整数,即占用单元
  • 2:\(x=1\) 输出 BELONG,否则输出 NO
  • 3DISTINCT
  • 4:一行一个整数 \(v\)
  • 5SHARE v(\(v\) 为当前静态成员的值)

行末换行。

样例

输入 #1

9
0
1 0
1 1
1 3
2 1
2 2
2 3
2 4
3

输出 #1

1
1
1
3
BELONG
NO
NO
NO
DISTINCT

输入 #2

3
4 200
5
4 0

输出 #2

200
SHARE 200
0

说明

  • 空对象占 \(1\) 个单元,是为了让每个空对象都有独一无二的地址。
  • 有了非静态成员之后,按成员个数计数,不要再加 \(1\)。
  • 静态成员不属于对象,但所有对象看到的是同一份数据。
  • 不要输出 sizeof 的具体字节数。

信息

ID
1113
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者