GESP 六级:类与对象历年真题
2026-08-29 17:11:09
发布于:广东
2026 年 6 月
第一部分:真题
单选第 1 题:继承与多态规则
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**关于继承、多态,哪种描述错误?
- A. 虚调用按实际对象分派
- B. 虚析构可支持基类指针删除
- C. 派生类可覆盖虚函数
- D. 构造可 virtual 动态绑定
单选第 2 题:设备工作方式不同
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**Device 的虚 work 在 Printer、Scanner 中被覆盖,两个基类指针指向不同设备。调用结果不同的关键是?
- A. 使用相同构造函数
- B. 虚调用按实际对象动态绑定
- C. 指针变量名不同
- D. 最后执行了 delete
单选第 3 题:公有接口与私有字段
**考点:**第 2 章 原题定位:官方 PDF 第 2 页
**题意整理:**Student 的 score 私有;main 标记依次为 getName、setScore、直接写 score、getName。哪一处违反权限?
- A. 第①处
- B. 第②处
- C. 第③处
- D. 第④处
判断第 1 题:再次判断虚构造
**考点:**第 8 章 原题定位:官方 PDF 第 6 页
**题意整理:**把构造函数声明为虚函数,可以据此实现运行时多态。
- A. 正确
- B. 错误
判断第 2 题:非虚析构的删除陷阱
**考点:**第 8 章 原题定位:官方 PDF 第 6 页
**题意整理:*原例 Base 析构没有 virtual;用 Base 指向 new Derived 后 delete。是否保证先执行派生析构,再执行基类析构?
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 2 题 | B |
| 单选第 3 题 | C |
| 判断第 1 题 | B |
| 判断第 2 题 | B |
单选第 1 题:继承与多态规则
原卷答案:D(构造可 virtual 动态绑定)
**思路提示:**先圈出构造函数,再回忆它能否带 virtual。
解析:
- 派生类覆盖基类虚函数,基类指针调用时可按实际类型选择实现。
- 虚析构用于支持正确的多态删除;这些都不是虚构造。
- C++11 构造函数不能是 virtual,故 D 不成立。
单选第 2 题:设备工作方式不同
原卷答案:B(虚调用按实际对象动态绑定)
**思路提示:**把“当前调用时选函数”和“以后结束时销毁对象”分开。
解析:
- work 是虚函数,实际设备分别为 Printer、Scanner,所以选中不同实现。
- 两个指针叫什么名字不影响选择;最后 delete 也不是先前 work 输出不同的原因。
- 这类题可以画两条箭头:d1 指向 Printer,d2 指向 Scanner,然后各找一个覆盖函数。
单选第 3 题:公有接口与私有字段
原卷答案:C(第③处)
**思路提示:**setScore 能修改 score,为什么 main 直接修改却不行?看访问发生的位置。
解析:
- setScore 是公有成员函数,外部能调用它;它在类内部访问本类私有数据是允许的。
- main 直接写对象.score 则是类外访问 private,第三处不合法。
- 封装控制的是访问路径,不是简单地禁止数据发生变化。
判断第 1 题:再次判断虚构造
原卷答案:B(错误)
思路提示:“想实现某个效果”不代表语法就支持这种写法。
解析:
- 构造函数不能使用 virtual,此说法不成立。
- 运行时多态看可覆盖的虚成员函数,以及基类指针或引用的实际对象。
- 记清“构造非虚、析构可虚”,不要把两个特殊成员函数相互替代。
判断第 2 题:非虚析构的删除陷阱
原卷答案:B(错误)
**思路提示:**先核对基类析构的声明,再讨论销毁顺序。
解析:
- 这里缺少经基类指针删除派生类对象所需的虚析构条件。
- 行为未定义,语言不保证任何特定析构顺序,所以“一定先派生再基类”是错误的。
- 正确修复是在这种可多态删除的基类上提供可访问的虚析构。不能把某次运行只显示 Base 当作固定规则。
2026 年 3 月
第一部分:真题
单选第 1 题:默认构造与 class/struct
**考点:**第 3 章 原题定位:官方 PDF 第 1 页
**题意整理:**关于 C++11 的类,选出成立的规则。
- A. 无用户声明构造时隐式声明默认构造
- B. 析构能按参数重载
- C. 所有成员必须公有
- D. class/struct 的默认权限相同
单选第 2 题:draw 为什么不同
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**Shape 指针分别指向 Circle、Rectangle;基类 draw 为虚函数且被两子类覆盖。输出不同的关键是什么?
- A. draw 是普通成员
- B. 基类 draw 为虚并发生分派
- C. 仅仅使用公有继承
- D. 两个指针名字不同
单选第 3 题:外部修改私有成员
**考点:**第 2 章 原题定位:官方 PDF 第 2 页
**题意整理:**Pet 的 name 为 private,getName 和 birthday 公有。main 四处标记依次为调用 getName、调用 birthday、直接改 name、再调用 getName。哪处不能编译?
- A. 第①处
- B. 第②处
- C. 第③处
- D. 第④处
判断第 1 题:写了有参构造还能无参吗
**考点:**第 3 章 原题定位:官方 PDF 第 6 页
**题意整理:**Point 只有接收两个坐标的构造;原题称 Point b 能自动调用编译器补出的无参构造,并把坐标置零。
- A. 正确
- B. 错误
判断第 2 题:继承方式与私有权限
**考点:**第 7 章 原题定位:官方 PDF 第 7 页
**题意整理:**C++ 支持单继承和多继承;普通子类成员不能直接访问父类 private 数据。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | A |
| 单选第 2 题 | B |
| 单选第 3 题 | C |
| 判断第 1 题 | B |
| 判断第 2 题 | A |
单选第 1 题:默认构造与 class/struct
原卷答案:A(无用户声明构造时隐式声明默认构造)
**思路提示:**检查默认构造的前提,并把“隐式声明”与“必定可调用”区分。
解析:
- A 精确给出了没有用户声明构造函数的前提,符合隐式默认构造的规则。
- 析构不能像普通函数那样按参数重载;类成员也不要求全是 public。
- class 默认 private,struct 默认 public。隐式默认构造若因成员、基类限制被删除,仍不能调用。
单选第 2 题:draw 为什么不同
原卷答案:B(基类 draw 为虚并发生分派)
**思路提示:**给指针改个变量名,行为会变吗?若去掉 virtual,才会改变哪一步?
解析:
- 两对象类型不同,虚 draw 调用按实际对象选择对应实现。
- 公有继承让转换成立,却不能单独保证动态分派;指针的名字更不决定输出。
- 原例的基类有虚析构,因此经基类指针 delete 也有正确的销毁链。
单选第 3 题:外部修改私有成员
原卷答案:C(第③处)
**思路提示:**定位“直接接触私有字段”的那一行,而不是所有出现对象名的行。
解析:
- 公有成员函数可以被 main 调用;函数内部有权按自己的代码访问本类数据。
- 直接写对象.name 则是在类外绕过接口访问私有成员,因此第三处错误。
- 想修改名字,需要类提供合适的公有修改方法,而不是以为构造过一次后就能任意访问。
判断第 1 题:写了有参构造还能无参吗
原卷答案:B(错误)
**思路提示:**题目有没有已经声明构造函数?先解决能否编译,再想初值。
解析:
- 已声明有参构造,编译器不会再自动补一个无参版本供 Point b 使用。
- 因此这行首先就不能通过相应的构造匹配,不应继续推算 b.x 与 b.y。
- 可显式写 Point() : x(0), y(0) {},或创建时给出坐标。即使默认构造存在,也不能笼统说所有数值自动置零。
判断第 2 题:继承方式与私有权限
原卷答案:A(正确)
**思路提示:**把“语言支持多继承”与“成员是否可直接访问”分别验证。
解析:
- C++ 可以有一个基类,也允许多个基类,因此前半句成立。
- 继承本身不会授予子类对父类私有成员的直接访问权限,后半句也成立。
- 本题按无额外友元授权的普通继承场景理解;数据仍在对象的基类部分,并没有被删除。
2025 年 12 月
第一部分:真题
单选第 1 题:虚函数规则辨析
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**关于虚函数,哪项不成立?
- A. 可支持运行时多态
- B. 调用可按实际对象分派
- C. 构造函数也可设为虚
- D. 基类可用虚析构支持释放
单选第 2 题:不同乐器的相同接口
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**Instrument 的虚 play 由 Piano 与 Guitar 各自覆盖,通过基类接口播放时呈现各自效果。体现哪种特性?
- A. 继承
- B. 封装
- C. 多态
- D. 链接
判断第 1 题:构造总次数是否为一
**考点:**第 5 章 原题定位:官方 PDF 第 9 页
**题意整理:**Test 仅手写会输出的 Test();先创建 a,再以 a 初始化 b。原题称构造总次数只有 1。
- A. 正确
- B. 错误
判断第 2 题:封装的含义再辨认
**考点:**第 2 章 原题定位:官方 PDF 第 9 页
**题意整理:**把数据与相应操作组合,并隐藏内部实现,是封装的基本含义。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | C |
| 单选第 2 题 | C |
| 判断第 1 题 | B |
| 判断第 2 题 | A |
单选第 1 题:虚函数规则辨析
原卷答案:C(构造函数也可设为虚)
**思路提示:**留意“构造”和“析构”只差一个字,规则却不同。
解析:
- 运行时分派依靠虚函数及实际对象类型;基类析构也可以被声明为虚。
- 构造函数不允许 virtual,故对应描述错误。
- 支持安全销毁不能只解释成避免泄漏:错误的非虚多态删除本身就是未定义行为。
单选第 2 题:不同乐器的相同接口
原卷答案:C(多态)
**思路提示:**不要只看见父类、子类就停止;继续看调用时选择了谁的实现。
解析:
- 两次调用面向同一个 play 接口,实际对象不同,执行的覆盖版本也不同。
- 这种运行时的不同表现就是多态。
- 原例使用虚析构配合动态释放;这与只写虚 play 而漏掉删除条件的旧例应当区分。
判断第 1 题:构造总次数是否为一
原卷答案:B(错误)
**思路提示:**为 a 和 b 各写一行,标注“默认构造”还是“拷贝构造”。
解析:
- a 使用默认构造 1 次。b 是新的对象,以 a 初始化会使用拷贝构造 1 次。
- 因此总构造次数为 2;官方此题判错误。
- 只有 Test() 中那行输出执行 1 次。把打印次数当成全部构造次数,是本题的关键陷阱。
判断第 2 题:封装的含义再辨认
原卷答案:A(正确)
**思路提示:**想想调用 getScore 的人是否需要知道分数在类里如何存放。
解析:
- 外部通过提供的接口使用对象,而不直接依赖内部实现细节。
- 内部将分数从一种表示改成另一种表示时,只要接口约定不变,调用者可以不必跟着改。
- 封装既包含组合,也包含接口与隐藏细节,不能只记一个 private 关键字。
2025 年 9 月
第一部分:真题
单选第 1 题:多态删除的条件
**考点:**第 8 章 原题定位:官方 PDF 第 1 页
**题意整理:**关于类,选出错误概括。
- A. 构造非虚,析构可虚
- B. 引用传参不复制形参对象
- C. 静态方法可由类名调用
- D. 基类析构是否虚不影响多态删除
单选第 2 题:为什么子类拥有已有方法
**考点:**第 7 章 原题定位:官方 PDF 第 1 页
**题意整理:**Car 未重新定义 move,却能使用从 Vehicle 获得的公有 move。这里直接体现哪种性质?
- A. 继承
- B. 封装
- C. 多态
- D. 链接
单选第 3 题:同一接口选择不同实现(讨论题)
**考点:**第 8 章 原题定位:官方 PDF 第 2 页
**题意整理:**Vehicle 的虚 move 在 Car 与 Bike 中分别覆盖,两个基类指针调用后表现不同。原题问体现哪种特性。
- A. 继承
- B. 封装
- C. 多态
- D. 链接
判断第 1 题:多态基类的析构设计
**考点:**第 8 章 原题定位:官方 PDF 第 6 页
**题意整理:**可能被多态使用的基类,原题建议把析构函数设为虚函数。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 2 题 | A |
| 单选第 3 题(讨论题) | C |
| 判断第 1 题 | A |
单选第 1 题:多态删除的条件
原卷答案:D(基类析构是否虚不影响多态删除)
**思路提示:**重点查看实际删除的对象类型与执行 delete 的指针类型是否不同。
解析:
- 当基类指针指向派生类动态对象,并通过它删除时,基类需要合适的虚析构函数。
- 不能因某次测试似乎只打印基类析构,就认定非虚删除仍然是正确行为;在该情形中是未定义行为。
- 其余选项分别考构造限制、引用不复制、静态成员无须绑定具体对象。
单选第 2 题:为什么子类拥有已有方法
原卷答案:A(继承)
**思路提示:**问题强调的是“方法从哪里来”,不是“同一接口输出为什么不同”。
解析:
- Car 是 Vehicle 的派生类,可以在访问规则允许的前提下使用继承来的方法。
- 这说明类型复用,即继承。没有必要为了选多态而臆造不同覆盖版本。
- 分辨口诀:已有功能从父类获得,先找继承;相同接口选择不同实现,再查多态。
单选第 3 题:同一接口选择不同实现(讨论题)
原卷答案:C(多态)
**思路提示:**既有继承,也有不同实现;题目强调的是哪一层现象?
解析:
- 官方 C:通过同一基类接口,按实际对象使用不同的覆盖函数,体现运行时多态。
- 继承是这里的基础,但仅仅存在继承还不能解释虚函数为何选择不同实现。
- 原例末尾的基类指针 delete 缺少虚析构保障,完整代码有未定义行为;保留考查意图,但不作为无争议输出程序。
**口径说明:**官方 C。教学示例需补 virtual 析构或改用合法生命周期管理。
判断第 1 题:多态基类的析构设计
原卷答案:A(正确)
**思路提示:**想一想“基类指针最后负责 delete 派生对象”的常见使用方式。
解析:
- 作为基础设计建议,官方判正确:公有虚析构可以支持经基类指针正确销毁派生对象。
- 最关键的条件是是否允许通过基类指针删除派生类对象,而不仅是“有一个虚函数”。
- 更高级设计也可用受保护的非虚析构禁止此类删除;六级先掌握常见的公有虚析构写法。
2025 年 6 月
第一部分:真题
单选第 1 题:不是面向对象三特征
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**选出不属于基本面向对象特征的一项。
- A. 继承
- B. 封装
- C. 多态
- D. 链接
单选第 2 题:初始化基类部分
**考点:**第 7 章 原题定位:官方 PDF 第 1 页
**题意整理:**Dog 继承 Animal;Animal 只有接收名字的构造。Dog 的初始化列表需把 name 交给基类,空格应选哪项?
- A. Animal(name)
- B. super(name)
- C. Animal::Animal(name)
- D. Animal()
单选第 3 题:同一程序中的虚调用(讨论题)
**考点:**第 8 章 原题定位:官方 PDF 第 2 页
**题意整理:**接上题,基类 speak 为 virtual,Dog 覆盖它;基类指针指向 new Dog,随后调用 speak。原题选择输出。
- A. 基类 speak 文本
- B. 派生类 speak 文本
- C. 编译错误
- D. 必然崩溃
判断第 1 题:构造函数能否 virtual
**考点:**第 8 章 原题定位:官方 PDF 第 6 页
**题意整理:**构造函数允许写成 virtual。
- A. 正确
- B. 错误
判断第 7 题:子类直接读父类私有数据
**考点:**第 2 章 原题定位:官方 PDF 第 7 页
**题意整理:**Parent 把 value 设为 private,Child 的普通成员函数直接 return value;原题认为这段代码合法。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 2 题 | A |
| 单选第 3 题(讨论题) | B |
| 判断第 1 题 | B |
| 判断第 7 题 | B |
单选第 1 题:不是面向对象三特征
原卷答案:D(链接)
**思路提示:**把“程序组织思想”与“从代码生成程序的环节”区分。
解析:
- 继承、封装、多态分别描述类型复用、接口与数据组织、多种实现的行为。
- 链接是构建程序时处理目标代码与依赖等的过程,不是这三个面向对象特征之一。
- 做概念题先分类,不需要模拟代码。
单选第 2 题:初始化基类部分
原卷答案:A(Animal(name))
**思路提示:空格位于冒号后,目标是初始化基类部分,不是调用普通函数。
解析:
- 基类名加括号中的实参,是初始化列表中初始化基类部分的写法。
- 这里要把 name 交给 Animal 的带参构造,不能省掉参数去找不存在的无参版本。
- super 不是此处的 C++ 语法;基类名::基类名 也不是这个位置的写法。
**口径说明:原卷后续有非虚基类析构配合基类指针 delete 的问题,不影响本空的考查意图;教行代码应补虚析构。
单选第 3 题:同一程序中的虚调用(讨论题)
原卷答案:B(派生类 speak 文本)
**思路提示:**先定位 speak 调用选择谁,再独立检查最后的 delete。
解析:
- 官方 B,意图考查指针实际指向 Dog,speak 使用派生类覆盖版本。
- 但完整原例随后通过 Animal* 删除 Dog,Animal 析构非虚,产生未定义行为。不能把整段程序的输出当成语言保证。
- 修正时给基类补虚析构;此时 speak 的派生类分派才可放在完整合法程序中验证。
**口径说明:**保留原卷 B;不执行含未定义行为的原例来“证明”结果。原构造函数也有输出,选项重点仅针对 speak。
判断第 1 题:构造函数能否 virtual
原卷答案:B(错误)
**思路提示:**构造函数与析构函数的规则不能混为一条。
解析:
- C++11 不允许虚构造函数。
- 析构函数可以是 virtual,普通非静态**函数也可按规则成为虚函数。
- 因此看到“构造也可 virtual”应判错,而不是因为想实现多态就认为合法。
判断第 7 题:子类直接读父类私有数据
原卷答案:B(错误)
**思路提示:访问代码位于 Child 内,不是在 Parent 的函数内。
解析:
- Child 虽然继承 Parent,但并不自动获得 Parent 私有数据的直接访问权限。
- 在给定代码中,return value 因权限而不能编译。
- 可以通过父类公开的方法读取,或根据合理设计改用 protected;不能把所有字段都随意改公开来回避理解。
2025 年 3 月
第一部分:真题
单选第 1 题:类能否扩展
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**以下哪项把类的性质说得过于绝对?
- A. 抽象共同状态与行为
- B. 可包含数据和方法
- C. 可实例化得到对象
- D. 定义后永远不能修改或扩展
单选第 8 题:构造次数的计数口径(讨论题)
**考点:**第 5 章 原题定位:官方 PDF 第 3 页
**题意整理:**MyClass 只手写了会打印的 MyClass();main 定义 obj1,再用 obj1 初始化 obj2。原题问构造调用次数。
- A. 1
- B. 2
- C. 3
- D. 0
单选第 15 题:继承转换与虚函数
**考点:**第 8 章 原题定位:官方 PDF 第 6 页
**题意整理:**Circle、Rectangle 公有继承 Shape,并覆盖其虚函数 area。基类指针先后指向两局部对象。哪项说法错误?
- A. 两次基类指针赋值编译失败
- B. Shape 是两者的基类
- C. 派生类型可复用并扩展
- D. 虚函数调用体现运行时多态
判断第 5 题:无参构造与重载
**考点:**第 3 章 原题定位:官方 PDF 第 8 页
**题意整理:**原题说构造函数可以重载,但无参数的构造版本只能有一个。
- A. 正确
- B. 错误
判断第 8 题:封装不是只有私有变量
**考点:**第 2 章 原题定位:官方 PDF 第 8 页
**题意整理:**把数据与操作绑定,向外隐藏实现细节,属于封装。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 8 题(讨论题) | A |
| 单选第 15 题 | A |
| 判断第 5 题 | A |
| 判断第 8 题 | A |
单选第 1 题:类能否扩展
原卷答案:D(定义后永远不能修改或扩展)
**思路提示:区分“修改源码后重新编译”“通过继承扩展”与“运行时随意给实例加”。
解析:
- 类描述共同的数据和操作,可以创建具体对象。
- 软件开发时可以修改类定义并重新编译,也可通过继承设计扩展类型,所以“永远不能扩展”不成立。
- 这不表示运行中的普通 C++ 对象可以像字典那样随意新增数据**。不要把题目理解成动态改变类布局。
单选第 8 题:构造次数的计数口径(讨论题)
原卷答案:A(1)
**思路提示:**把“那行打印执行几次”和“包括拷贝构造在内的总次数”分别数一遍。
解析:
- 官方选 A,即 1;这对应显式写出的无参构造函数体执行 1 次。
- 但 MyClass obj2 = obj1 创建了第二个对象,会使用隐式拷贝构造。若题目按全部构造调用计数,应为 2,即 B。
- 隐式拷贝构造不执行 MyClass() 中的那行打印。两种数法回答的是两个不同问题,本题不作普通单答案计分。
**口径说明:**原卷 A;严格的总构造计数为 2。2025-12 判断第 1 题采用包含拷贝构造的口径。
单选第 15 题:继承转换与虚函数
原卷答案:A(两次基类指针赋值编译失败)
**思路提示:**先检查是否公有、无歧义继承,再追踪函数是否为 virtual。
解析:
- 本题的公有继承允许把派生类对象地址交给基类指针,指针赋值不会因类型名不同而失败。
- 调用虚函数 area 时按实际对象选择对应覆盖版本,这是运行时多态。
- 这不代表任意基类对象都可反向当成派生类;向上转换与向下转换不能混用。
判断第 5 题:无参构造与重载
原卷答案:A(正确)
**思路提示:**这里的“无参数”先按参数列表为空的 A() 理解。
解析:
- 同一个类不能用两个相同的 A() 定义来形成重载,参数列表没有区别。
- 可以另写 A(int) 等不同参数版本,所以构造函数总体上能够重载。
- “默认构造函数”还有所有参数带默认值的含义;A() 与 A(int=0) 会使无参调用产生歧义。不要把原句扩大为所有语法情形的定义。
**口径说明:**官方正确,按空参数列表版本理解;补充默认实参导致歧义的边界。
判断第 8 题:封装不是只有私有变量
原卷答案:A(正确)
**思路提示:**既要看到数据,也要看到允许外部使用的操作。
解析:
- 封装把状态和操作组织成一个整体,并对外提供稳定的使用方式。
- 例如私有 score 配合公有 setScore/getScore;类外不必知道内部怎么保存。
- 只把变量改成 private、却不给所需的公有操作,并不等于一个好用的接口。
2024 年 12 月
第一部分:真题
单选第 1 题:面向对象与一般设计方法
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**按原卷的概念分类,哪项不是面向对象的特有识别项?
- A. 抽象
- B. 封装
- C. 继承
- D. 模块化
单选第 2 题:类**与封装口径(讨论题)
**考点:**第 2 章 原题定位:官方 PDF 第 1 页
**题意整理:原题选择正确的类描述,其四项分别涉及默认权限、构造返回类型、私有数据访问及函数是否逐对象复制。
- A. class 默认公有
- B. 构造必须写 void
- C. 公有接口是私有数据唯一途径
- D. 每对象都单独存一份**函数
单选第 3 题:空指针不是对象
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
*题意整理:MyClass obj 被置为空指针,随后 obj->display() 调用非静态函数。正确诊断是哪项?
- A. NULL 不能赋给指针
- B. 对象必须用非指针方式创建
- C. 没有有效对象,调用不合法
- D. 该调用合法但没有输出
判断第 1 题:构造函数的重载
**考点:**第 3 章 原题定位:官方 PDF 第 6 页
**题意整理:**构造函数与类同名,参数列表不同可以形成多个重载版本。
- A. 正确
- B. 错误
判断第 2 题:静态函数与普通数据
**考点:**第 6 章 原题定位:官方 PDF 第 6 页
**题意整理:原题断言静态函数既能访问静态数据,又能访问非静态数据。
- A. 正确
- B. 错误
判断第 6 题:创建子类会不会构造父类
**考点:**第 4 章 原题定位:官方 PDF 第 7 页
**题意整理:**生成派生类对象时,只调用派生类自己的构造函数。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 2 题(讨论题) | C |
| 单选第 3 题 | C |
| 判断第 1 题 | A |
| 判断第 2 题 | B |
| 判断第 6 题 | B |
单选第 1 题:面向对象与一般设计方法
原卷答案:D(模块化)
思路提示:“别的编程方式也能实现”与“这种方法没有价值”不是一回事。
解析:
- 原卷答案 D,意在区分面向对象的核心概念与通用的软件组织方法。
- 面向过程程序也能拆成多个模块,模块化不是面向对象独有的标志。
- 不能由此说模块化不重要,或面向对象不能模块化;抽象也确实是重要的设计思想。
单选第 2 题:类**与封装口径(讨论题)
原卷答案:C(公有接口是私有数据唯一途径)
**思路提示:**先排除默认权限和构造返回类型,再检查“唯一”有没有例外。
解析:
- 官方答案 C,想考查把数据设为私有、通过公有接口访问的封装方式。
- 但“唯一途径”不严谨:本类其他**和友元等也可以合法访问私有数据。
- class 默认 private;构造没有返回类型;**函数代码也不是每个对象复制一套。因此这里保留官方口径,但不把 C 的绝对表述当作严格规则。
**口径说明:**此题不计普通正确率,重点是理解封装,不背“唯一途径”。
单选第 3 题:空指针不是对象
原卷答案:C(没有有效对象,调用不合法)
**思路提示:**先画出指针指向哪里;空指针是否对应一个已创建对象?
解析:
- obj 本身是一个指针变量,但它指向空处,没有可供调用普通**函数的 MyClass 对象。
- NULL 在相应 C++ 写法中可表示空指针,改成 nullptr 并不能让对象凭空出现。
- 可先创建 MyClass x,再令 obj = &x。原来的调用是未定义行为,不能用一次碰巧打印成功来认定合法。
判断第 1 题:构造函数的重载
原卷答案:A(正确)
**思路提示:**比较的是参数的类型与数量等,不是参数变量的名字。
解析:
- A() 和 A(int) 可为不同的创建方式提供初始化逻辑。
- A(int x) 与 A(int y) 只改名字,并没有形成不同的参数列表。
- 构造函数没有返回类型,不能用改变返回类型来区分重载。
判断第 2 题:静态函数与普通数据
原卷答案:B(错误)
**思路提示:**按题目默认的“直接访问”口径,静态函数有没有 this?
解析:
- 官方按直接访问判错误:静态函数不绑定具体对象,没有 this,不能裸用某个普通。
- 它可以直接使用静态数据;如果另有一个对象或引用,也可以通过那个对象访问权限允许的普通数据。
- 因此与 2024 年 6 月题一起记“是否指定了具体对象”,而不是背两句看起来相反的口号。
**口径说明:这里明确采用不额外指定对象、直接访问的原卷口径。
判断第 6 题:创建子类会不会构造父类
原卷答案:B(错误)
**思路提示:**把派生对象拆成“基类部分”和“派生类新增部分”。
解析:
- 基类部分不会因为创建的是子类对象就消失。
- 先完成基类初始化,才轮到派生类自己的**与构造函数体。
- 只要例子是普通有基类构造的继承,就能看出“只调用”不成立。
2024 年 9 月
第一部分:真题
单选第 1 题:哪项不是面向对象用法
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**下列操作中,哪一项本身没有体现类与对象机制?
- A. 定义 class 或 struct
- B. 调用 printf
- C. 调用自定义**函数
- D. 从同一基类派生多个类
单选第 2 题:派生类访问权限
**考点:**第 2 章 原题定位:官方 PDF 第 1 页
**题意整理:**Base 中 a 私有、b 保护、c 公有。Derived 公有继承 Base,其 show 内依次输出 a、b、c。哪个标记位置不能编译?
- A. 访问 a 的 Line 1
- B. 访问 b 的 Line 2
- C. 访问 c 的 Line 3
- D. 调用 show 的 Line 4
判断第 1 题:支持面向对象的语言
**考点:**第 1 章 原题定位:官方 PDF 第 8 页
**题意整理:**C++、Python 和 Java 都支持面向对象编程。
- A. 正确
- B. 错误
判断第 2 题:静态数据可由谁访问
**考点:**第 6 章 原题定位:官方 PDF 第 8 页
**题意整理:**静态数据成员只能由该类对象的成员函数访问。
- A. 正确
- B. 错误
判断第 4 题:基类指针调用虚函数
**考点:**第 8 章 原题定位:官方 PDF 第 8 页
**题意整理:**base::show 为虚函数,derived 正确覆盖;base 指针指向局部 derived 对象。调用 show 会使用 derived 版本。
- A. 正确
- B. 错误
判断第 5 题:派生对象的构造顺序
**考点:**第 4 章 原题定位:官方 PDF 第 9 页
**题意整理:**创建派生类对象时,只运行派生类构造,不运行基类构造。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | B |
| 单选第 2 题 | A |
| 判断第 1 题 | A |
| 判断第 2 题 | B |
| 判断第 4 题 | A |
| 判断第 5 题 | B |
单选第 1 题:哪项不是面向对象用法
原卷答案:B(调用 printf)
**思路提示:**看操作本身,不要因为程序用 C++ 写就全部算面向对象。
解析:
- printf 是普通库函数调用,这件事本身不需要定义类、创建类对象或使用继承。
- 定义类、调用成员、建立派生关系,都直接涉及面向对象机制。
- 同一个 C++ 程序中可以混用不同编程方式;本题不是问 printf 能否出现在类里。
单选第 2 题:派生类访问权限
原卷答案:A(访问 a 的 Line 1)
**思路提示:**先确认访问发生在子类成员函数内,而不是 Base 自己的函数内。
解析:
- 私有 a 只给 Base 自身成员及获授权的访问者使用,Derived 的普通 show 无权直接访问它。
- 在这段代码的访问方式中,保护 b、公有 c 可以在 Derived 成员函数内访问。
- “public 继承”不会把父类的 private 改成 public,因此不能忽略 a 原来的标签。
判断第 1 题:支持面向对象的语言
原卷答案:A(正确)
**思路提示:**判断语言有没有对应机制,不是判断它只能用这一种方式。
解析:
- 三种语言都能定义类并创建对象,也提供继承等机制。
- 支持不等于只支持,C++ 还可以用普通函数组织面向过程代码。
- 因此本题正确,但不要扩大成“它们的任何东西都是对象”。
判断第 2 题:静态数据可由谁访问
原卷答案:B(错误)
**思路提示:**如果它是 public,普通 main 能否写 类名::变量?
解析:
- 公有静态成员可以在类外通过 类名::成员 访问,这已经构成反例。
- 共享属性不等于特殊的私有权限,权限仍由 public/private/protected 决定。
- 所以“只能由成员函数访问”说得太窄。
判断第 4 题:基类指针调用虚函数
原卷答案:A(正确)
**思路提示:*沿着赋值语句追踪指针,不要停在 base 的声明上。
解析:
- 指针声明类型是 base*,实际对象却是 derived。
- show 在基类中为 virtual,派生类覆盖成功,因此执行 derived 的实现。
- 局部对象并没有通过该指针 delete,这里不要凭空添加动态释放的问题。
判断第 5 题:派生对象的构造顺序
原卷答案:B(错误)
**思路提示:**派生类对象中的基类部分,由谁负责初始化?
解析:
- 派生对象包含基类部分,基类部分也要被初始化。
- 普通单继承的次序是先基类,再派生类成员,最后派生类构造函数体。
- 因此“只调用派生类”漏掉了基类构造。
2024 年 6 月
第一部分:真题
单选第 1 题:辨认面向对象三特征
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**选出面向对象基本特征的组合。
- A. 贪心、动态规划、回溯
- B. 并发、并行、异步
- C. 递归、循环、分治
- D. 封装、继承、多态
单选第 2 题:共享计数的输出
**考点:**第 6 章 原题定位:官方 PDF 第 1 页
**题意整理:**共享 count 初值 0,每次构造加 1、析构减 1。main 顺序创建三个局部对象,每创建一个立即输出 count,期间没有对象销毁。
- A. 1 1 1
- B. 1 2 3
- C. 1 1 2
- D. 1 2 2
单选第 3 题:返回值不等于输出
**考点:**第 8 章 原题定位:官方 PDF 第 2 页
**题意整理:**基类虚函数 area 被矩形、三角形覆盖;两版本先打印各自名称,再返回面积。基类指针先后指向两对象,直接调用 area(),没有输出其返回值。
- A. 只出现两个派生类名称
- B. 出现两次基类名称
- C. 运行错误
- D. 编译错误
判断第 2 题:对象创建与默认构造
**考点:**第 3 章 原题定位:官方 PDF 第 8 页
**题意整理:**对象创建涉及构造初始化;没有用户声明构造函数时,编译器可提供默认构造。
- A. 正确
- B. 错误
判断第 3 题:析构必须手写吗
**考点:**第 4 章 原题定位:官方 PDF 第 8 页
**题意整理:**每定义一个类,都必须显式编写析构函数。
- A. 正确
- B. 错误
判断第 4 题:类中定义类
**考点:**第 9 章 原题定位:官方 PDF 第 8 页
**题意整理:**C++ 允许在一个类内部定义另一个类。
- A. 正确
- B. 错误
判断第 8 题:静态函数能直接读谁
**考点:**第 6 章 原题定位:官方 PDF 第 8 页
**题意整理:**原题称静态成员函数只能访问静态成员变量。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题 | D |
| 单选第 2 题 | B |
| 单选第 3 题 | A |
| 判断第 2 题 | A |
| 判断第 3 题 | B |
| 判断第 4 题 | A |
| 判断第 8 题 | A |
单选第 1 题:辨认面向对象三特征
原卷答案:D(封装、继承、多态)
**思路提示:**先把算法类词语排除,再比较程序组织思想。
解析:
- 先判断题目在问程序组织思想,还是求解问题的算法。
- 把数据和操作放一起是封装;复用已有类型是继承;同一接口呈现不同实现是多态。
- 贪心、递归等是另外的概念,不是这三个面向对象基本特征。
单选第 2 题:共享计数的输出
原卷答案:B(1 2 3)
**思路提示:**只给 static count 列一列,不为三个对象分别开计数表。
解析:
- 创建第一个对象后 count 为 1,输出 1。第二、第三个创建后分别为 2、3。
- 它们都还没有离开 main 的作用域,因此三次输出前没有发生析构减一。
- 通过类名或对象调用公有静态打印函数,都读取同一份 count,不会重置它。
单选第 3 题:返回值不等于输出
原卷答案:A(只出现两个派生类名称)
**思路提示:**分别标出 cout 和 return;调用一个返回数值的函数,数值会自动显示吗?
解析:
- area 是虚函数,指针实际指向矩形时执行矩形版,指向三角形时执行三角形版。
- 这两次函数内部的 cout 会输出各自的名称。
- return 只是把面积交回调用处;调用处未接着 cout 返回值,因此不会自动打印 70 或 25。
判断第 2 题:对象创建与默认构造
原卷答案:A(正确)
思路提示:“没有定义”要和“已有一个带参数的构造”分开。
解析:
- 按原题的普通类创建语境,答案正确。构造函数不是需要在 main 中另手动调用的初始化按钮。
- 隐式默认构造有前提:没有用户声明构造函数。
- 不要从本题推出“任何类都能 A a”或“数据都自动为零”;这两个结论都缺少条件。
判断第 3 题:析构必须手写吗
原卷答案:B(错误)
**思路提示:**找一个只含普通整数成员的简单类,是否必须写清理代码?
解析:
- 没有这种普遍要求;编译器可以隐式声明析构函数。
- 是否需要手写,要看类是否承担额外的资源清理责任。
- 尤其不要把语法要求与“new 出来的内存需要正确管理”混为同一件事。
判断第 4 题:类中定义类
原卷答案:A(正确)
**思路提示:**把嵌套类与函数内定义普通函数区分开。
解析:
- 类内可以声明或定义嵌套类型。
- 例如公开的 Board::Cell 表示 Board 作用域里的 Cell 类型。
- 名称写对后仍要检查 public/private;作用域限定符不改变访问权限。
判断第 8 题:静态函数能直接读谁
原卷答案:A(正确)
**思路提示:**补出隐含条件:“不指定对象而直接访问”。如果给出一个对象,还一样吗?
解析:
- 原卷按“直接访问本类成员”的口径判正确。静态成员函数没有 this,不能直接决定读哪个对象的普通成员。
- 但给它一个对象参数 c,就可以在权限允许时读取 c.value。
- 因此应记“不能无对象地直接访问非静态成员”,而不是“绝对无法访问”。
**口径说明:**原卷为正确;本题的“只能”需按直接访问口径理解。
2024 年 3 月
第一部分:真题
单选第 2 题:面向对象的基本原则
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**哪一组属于面向对象的基本原则?
- A. 贪心、动态规划、回溯
- B. 并发、并行、异步
- C. 递归、循环、分治
- D. 封装、继承、多态
单选第 4 题:创建对象并调用方法
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**Circle 的构造函数接收一个 double;公有 getArea 不接收参数。类外哪种创建、调用方式正确?
- A. 创建 c,再给 c.getArea 传 c
- B. 创建 c,再直接调用 getArea(c)
- C. 用 new 的结果赋给 Circle 对象
- D. Circle c(5.0); c.getArea();
判断第 3 题:继承的含义
**考点:**第 7 章 原题定位:官方 PDF 第 5 页
**题意整理:**通过继承,在新类中复用已有类的属性与方法。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 2 题 | D |
| 单选第 4 题 | D |
| 判断第 3 题 | A |
单选第 2 题:面向对象的基本原则
原卷答案:D(封装、继承、多态)
**思路提示:**给每个术语找一个“类与对象”的例子,别与算法名称混淆。
解析:
- 先判断题目在问程序组织思想,还是求解问题的算法。
- 把数据和操作放一起是封装;复用已有类型是继承;同一接口呈现不同实现是多态。
- 贪心、递归等是另外的概念,不是这三个面向对象基本特征。
单选第 4 题:创建对象并调用方法
原卷答案:D(Circle c(5.0); c.getArea();)
**思路提示:**逐项查两件事:创建得到的是对象还是指针?成员函数实际需要几个参数?
解析:
- 构造 Circle c(5.0) 时,把半径交给构造函数。getArea 是 c 的成员函数,调用写成 c.getArea()。
- 无参 getArea 不能额外传入 c,也不是直接调用的普通 getArea(c)。
- new Circle 返回 Circle*,不能直接用它初始化 Circle 对象。对象与指针要分清。
判断第 3 题:继承的含义
原卷答案:A(正确)
**思路提示:**看到“已有类 → 新类”,先想到哪种关系?
解析:
- 继承让派生类建立在基类的基础上,而不必把共同部分全部重新写一遍。
- 例如 Student 公有继承 Person 后,可以复用其公有 getAge。
- 复用不等于拥有任意访问权限,基类 private 仍不能被派生类普通成员函数直接访问。
2023 年 12 月
第一部分:真题
单选第 1 题:对象与函数的边界(讨论题)
**考点:**第 1 章 原题定位:官方 PDF 第 1 页
**题意整理:**原题要求选错误说法,涉及“一切皆对象”、自定义类、把函数当对象,以及函数内嵌套定义普通函数。
- A. 一切皆对象
- B. 可自定义类并实例化
- C. 函数都是类或对象
- D. 函数体内可定义普通函数
单选第 2 题:嵌套类的名称与权限(讨论题)
**考点:**第 9 章 原题定位:官方 PDF 第 2 页
**题意整理:**Rectangle 在 private 区域定义 Point。原题选错误描述。
- A. 允许类内再定义类
- B. Point 是嵌套类型
- C. 嵌套类型可随意访问
- D. 可写 Rectangle::Point 访问
单选第 3 题:访问同一份静态数据
**考点:**第 6 章 原题定位:官方 PDF 第 2 页
**题意整理:**newClass 有公有 static int objCounter,类外已定义为 2。创建 classA、classB 后,比较类名访问与 classB 访问。
- A. 仅类名访问错误
- B. 仅对象访问错误
- C. 两种访问都合法
- D. 类内声明可改为自增语句
单选第 4 题:是否必须手写析构
**考点:**第 4 章 原题定位:官方 PDF 第 3 页
**题意整理:**BiTree 用节点结构和构造函数建立二叉树。关于这个类,哪项说法有误?
- A. 节点结构可组织二叉树
- B. BiNode 描述节点
- C. 构造函数可建立树
- D. 析构函数必须手写
判断第 1 题:方法对应成员函数
**考点:**第 1 章 原题定位:官方 PDF 第 9 页
**题意整理:**面向对象中的“方法”,在 C++ 类中对应成员函数。
- A. 正确
- B. 错误
判断第 2 题:默认构造的前提
**考点:**第 3 章 原题定位:官方 PDF 第 9 页
**题意整理:**没有用户声明构造函数的类,编译器会隐式声明默认构造函数。
- A. 正确
- B. 错误
判断第 3 题:下标运算符的范围(讨论题)
**考点:**第 9 章 原题定位:官方 PDF 第 10 页
**题意整理:**原题认为:类对象能够使用下标,说明其类中以成员函数重载了下标运算符。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 1 题(讨论题) | D |
| 单选第 2 题(讨论题) | C |
| 单选第 3 题 | C |
| 单选第 4 题 | D |
| 判断第 1 题 | A |
| 判断第 2 题 | A |
| 判断第 3 题(讨论题) | A |
单选第 1 题:对象与函数的边界(讨论题)
原卷答案:D(函数体内可定义普通函数)
**思路提示:**先区分普通函数与函数对象;这道旧题不能只靠背官方字母。
解析:
- 官方给 D:C++ 不允许在普通函数体内直接定义另一个普通函数;lambda 是另一种语法,不是这个例外的简单替代说法。
- 但 C 也有问题:C++ 的普通函数不是对象。函数对象指具有调用能力的类对象等,不能与普通函数混为一谈。
- A 的“一切皆对象”同样过于绝对。因此本题只作辨析,不能当作严格只有一个错误选项的题来训练。
**口径说明:**官方答案 D;题面本身有不严谨之处。不会据此教学生“C++ 中函数都是对象”。
单选第 2 题:嵌套类的名称与权限(讨论题)
原卷答案:C(嵌套类型可随意访问)
**思路提示:**作用域限定符解决“名字属于谁”,但它能否越过 private?
解析:
- 官方答案 C:嵌套类型不能任意、不受约束地访问。
- 还必须补上原图中的 private 条件:普通类外代码即使写 Rectangle::Point,也不能绕过权限。
- D 若只是说明限定名称的形式可以理解;若理解为 main 中可以直接用,则也不成立。本题不作单答案计分。
**口径说明:**原题代码中 Point 位于 private,而不是 public;没有在教学整理中悄悄改成公有。
单选第 3 题:访问同一份静态数据
原卷答案:C(两种访问都合法)
**思路提示:**先看 static,再看 public;创建两个对象是否会自动让计数加二?
解析:
- public 决定类外能访问,static 决定数据只有一份。
- newClass::objCounter 与 classB.objCounter 都访问这同一份数据,所以两次读出都是 2。
- 代码没有构造函数自增逻辑,不能擅自把“创建两个对象”换成“计数自动加二”;类成员声明处也不能直接塞普通自增语句。
单选第 4 题:是否必须手写析构
原卷答案:D(析构函数必须手写)
**思路提示:**区分“语法必须写”和“管理动态资源时应当负责清理”。
解析:
- 语言没有要求每个类都显式编写析构函数,可以隐式声明默认析构。
- 因此“析构函数不可以省略”不是普遍成立的语法规则。
- 若树节点由 new 分配且由此类拥有,不手写正确清理逻辑可能泄漏。语法能省略,不等于资源管理已经正确。
判断第 1 题:方法对应成员函数
原卷答案:A(正确)
**思路提示:**先把数据与操作分开:保存分数的是哪一个,修改分数的是哪一个?
解析:
- score 等成员数据描述状态,add 或 getScore 等成员函数描述可执行的操作。
- 方法不是类中的普通变量,而是可调用的成员函数。
- 成员函数可以在类内定义,也可以先在类内声明,再用 类名::函数名 在类外定义;别把“只能写在大括号内”当作规则。
判断第 2 题:默认构造的前提
原卷答案:A(正确)
**思路提示:**原题说“没写构造”,不是“已经写了一个有参构造”。
解析:
- 没有用户声明构造函数时,语言提供隐式默认构造的规则。
- 只写 A(int) 已经不满足这个前提,此时 A a 不会自动获得一个额外的 A()。
- 隐式声明出来还不保证一定可调用:成员或基类的限制可能使它被删除,也不保证普通数字成员全部为零。
**口径说明:**这里把原题的“没有构造函数”明确为“没有用户声明”,避免把已写有参构造的情形混进来。
判断第 3 题:下标运算符的范围(讨论题)
原卷答案:A(正确)
**思路提示:**先分清“类自己提供 operator[]”与“转换后使用内建下标”。
解析:
- 官方答案为正确,考查意图是 C++11 的自定义 operator[] 要作为非静态成员函数。
- 严格说,类对象也可能先隐式转换成指针,再使用内建下标,不一定是类提供了 operator[]。
- 所以把这题作规则范围辨析,不把原题的推断当成无条件成立的定理。
**口径说明:**原卷正确;无条件表述存在转换后使用内建下标的反例。本页不计正确率。
2023 年 9 月
第一部分:真题
单选第 3 题:编程语言与面向对象
**考点:**第 1 章 原题定位:官方 PDF 第 2 页
**题意整理:**哪种语言没有内建的类与继承机制,不属于本题所说的面向对象语言?
- A. C++
- B. Python
- C. Java
- D. C
单选第 4 题:类成员类型有限制
**考点:**第 9 章 原题定位:官方 PDF 第 2 页
**题意整理:**关于自定义类,选出不成立的描述。
- A. 对象创建可涉及构造
- B. 构造可参与隐式转换
- C. 可重载比较运算符
- D. 成员类型毫无限制
单选第 5 题:对象能否直接输出
**考点:**第 9 章 原题定位:官方 PDF 第 3 页
**题意整理:**MyStr 只有私有字符串 data 和接收字符串的构造函数,没有输出运算符或相关转换。选出错误描述。
- A. cout 输出 st 会得到 ABC
- B. data 是成员变量
- C. 用 ABC 可构造 st
- D. 以上描述都对
单选第 7 题:用类封装数据结构
**考点:**第 2 章 原题定位:官方 PDF 第 4 页
**题意整理:**ManyData 的 push 写入 data[tail++],pop 返回 data[--tail];数组为私有,容量 100,示例只压入 4 个值。哪个判断正确?
- A. 示例不能运行
- B. 该操作方式为队列
- C. main 可直接读私有数组
- D. push/pop 需考虑边界保护
单选第 8 题:连续调用与返回自身
**考点:**第 6 章 原题定位:官方 PDF 第 6 页
**题意整理:**MoreData 用 tail 入队、head 出队;push 返回 MoreData&,函数末尾 return *this。容量足够时,哪个描述错误?
- A. 实现先进先出的操作
- B. 连续 .push 调用不能编译
- C. 数组是类的私有成员
- D. 以上描述都对
单选第 15 题:静态常量的初始化口径(讨论题)
**考点:**第 6 章 原题定位:官方 PDF 第 10 页
**题意整理:**原题比较 const 成员调用、静态常量的类内外初始化,以及全局对象的初始化时机。哪项“不正确”?
- A. 常对象调用 const 成员
- B. 静态常量只能类外初始化
- C. 类类型静态成员应先初始化
- D. 全局对象一律在 main 前初始化
判断第 3 题:类与对象的方向
**考点:**第 1 章 原题定位:官方 PDF 第 11 页
题意整理:“类是对象的实例”这一关系正确吗?
- A. 正确
- B. 错误
判断第 4 题:静态数据的共享
**考点:**第 6 章 原题定位:官方 PDF 第 11 页
**题意整理:**同一个类的 static 数据成员由该类对象共享,而不是每个对象各保存一份。
- A. 正确
- B. 错误
判断第 5 题:类中的函数种类
**考点:**第 9 章 原题定位:官方 PDF 第 11 页
**题意整理:**类中可以提供用于初始化的函数,以及合规的运算符重载函数。
- A. 正确
- B. 错误
第二部分:答案与解析
答案速查
| 题目 | 原卷答案 |
|---|---|
| 单选第 3 题 | D |
| 单选第 4 题 | D |
| 单选第 5 题 | A |
| 单选第 7 题 | D |
| 单选第 8 题 | B |
| 单选第 15 题(讨论题) | B / D |
| 判断第 3 题 | B |
| 判断第 4 题 | A |
| 判断第 5 题 | A |
单选第 3 题:编程语言与面向对象
原卷答案:D(C)
**思路提示:**分清 C 与 C++,不能因为名字接近就把两者等同。
解析:
- 先认清题目考的是语言提供的机制,而不是某个程序用了多少函数。
- C++、Python、Java 都提供类等面向对象机制;C 没有原生的 class 与继承语法。
- C++ 也支持面向过程。支持面向对象,不代表每段代码都必须创建类。
单选第 4 题:类成员类型有限制
原卷答案:D(成员类型毫无限制)
**思路提示:**试想一个 Node 对象中,再完整放一个 Node,会发生什么?
解析:
- 抓住“任意类型”这样的绝对词。普通非静态成员需要满足类型完整性等规则。
- 类可以保存自身类型的指针,却不能完整包含一个自身类型的普通数据成员;否则对象布局会无限递归。
- 非 explicit 转换构造函数、比较运算符重载都有合法写法,因此不能把另外几项一概否定。
单选第 5 题:对象能否直接输出
原卷答案:A(cout 输出 st 会得到 ABC)
**思路提示:**创建成功与支持输出是两个条件;检查输出运算符是否有匹配版本。
解析:
- 构造函数能把字符串放进对象,但它不会自动教会 cout 如何输出整个对象。
- 缺少相应的 operator<< 或合法转换时,cout << st 不成立;错误发生在编译阶段。
- 也不能直接在 main 中改为 st.data,因为 data 是私有成员。可以增加公有查询方法,或正确实现输出重载。
**口径说明:**原卷采用“找具体错误说法”的选项结构,答案列为 A;末项是概括性兜底选项。
单选第 7 题:用类封装数据结构
原卷答案:D(push/pop 需考虑边界保护)
**思路提示:**分别检查:数据从哪端取、访问在哪发生、空与满时下标会怎样。
解析:
- 示例只有 4 次压入,没有超过容量;但这不能证明类的所有用法都安全。
- pop 从最后放入的位置取值,体现后进先出;main 不能直接访问私有数组。
- 空时继续 pop 或满时继续 push 都可能越界。接口需要判空、判满,或提供合适的错误处理。
**口径说明:**仅按本题讨论的数据结构操作归类;原例的原始动态数组还需要正确管理释放和复制。
单选第 8 题:连续调用与返回自身
原卷答案:B(连续 .push 调用不能编译)
**思路提示:**不要先数容量;先查 push 的返回类型,再判断返回值上能否继续调用成员函数。
解析:
- 第一次 push 返回当前对象自身的引用,而不是 void。
- 所以 a.push(11).push(12).push(13) 是连续操作同一个对象,可以成立。
- head 向后取值对应先进先出。链式调用合法与容量是否越界必须分开检查。
**口径说明:**原卷答案 B;“都对”为概括性选项。原解析谈容量不足以解释链式调用,关键其实是引用返回值。
单选第 15 题:静态常量的初始化口径(讨论题)
原卷答案:B / D(静态常量只能类外初始化 / 全局对象一律在 main 前初始化)
**思路提示:**带“所有”“一律”的规则,先检查语言版本和常量初始化特例。
解析:
- 原卷官方解析接受 B、D 两种答案,本页不把它当成普通单答案题计分。
- C++11 允许静态 const 整型成员在类内给出常量初始化,因此“所有静态常量只能类外初始化”过于绝对。
- 全局对象的静态初始化、动态初始化及延后时机另有规则。基础复习不靠这题背一个覆盖全部情况的时间口诀。
**口径说明:**保留官方双答案处理,不把其中一个删掉。A 也应放在非静态成员调用的通常语境理解。
判断第 3 题:类与对象的方向
原卷答案:B(错误)
**思路提示:**把 Student 和 Student a 中的两者分别代入原句。
解析:
- Student 是类型,a 才是按该类型创建的具体对象。
- 正确关系是“对象是类的实例”。原句把方向说反了。
- 别只看见“类、对象、实例”三个熟悉的词就判断正确,要把主语和宾语读完整。
判断第 4 题:静态数据的共享
原卷答案:A(正确)
**思路提示:**给两个对象改同一个静态变量,判断是两份账还是一份账。
解析:
- 静态数据属于类,不是单个对象的普通数据副本。
- 若公有静态 count 被 a 改成 3,再通过 b 读它,也会读到 3。
- 共享不等于公开:如果 static 成员在 private 区域,类外依然不能随便直接访问。
判断第 5 题:类中的函数种类
原卷答案:A(正确)
**思路提示:**类能包含操作,不是只能放变量。
解析:
- 构造函数参与对象初始化,普通成员函数也可以承担初始化或修改状态的工作。
- 例如 bool operator<(const Score&) const 可以给自定义类型规定比较方式。
- 可以定义不代表语法任意:构造函数没有返回类型,运算符重载也必须遵守对应规则。
官方资料
这里空空如也










有帮助,赞一个