本讲定位:六级最独立、也最容易拿满的一块。和前八讲的算法毫无关系,纯粹是 C++ 语法。
真题分布三年几乎不变:单选第 1~3 题固定考面向对象,判断题再出 1~2 条,合计 8~10 分。而且考的点非常集中——构造函数不能是虚函数、private 成员在类外访问会编译错、虚函数实现多态、析构函数要不要 virtual,来来回回就这几条。
本讲的目标很明确:只讲考过的,背熟就全拿。 不讲运算符重载、友元、模板、纯虚类——这些三年真题一次都没考过。
对应官方大纲:六级知识块 5「面向对象」——面向对象思想、类的创建和初始化、类的特性(继承、封装、多态)。
前置知识:四级第 03 讲(结构体)。
代码说明:本讲代码均已用 g++ 11.5(
-std=c++11)编译运行验证;故意写错的那几行一律用注释标出,文中给出 g++ 的真实报错原文(已在本机编译复现)。
四级学过结构体 struct,类 class 就是「能装函数的结构体」。
| 概念 | 是什么 | 类比 |
|---|---|---|
| 类(class) | 一个模板、一张图纸 | 「学生」这个概念 |
| 对象(object) | 按图纸造出来的实例 | 具体的「小杨」这个学生 |
| 成员变量 | 对象里存的数据 | 姓名、分数 |
| 成员函数(方法) | 对象能做的事 | 查分、改分 |
⚠️ 判断题原题(2025 年 12 月六级判断第 2 题,官方答案「对」):「面向对象编程中,封装是指将数据和操作数据的方法绑定在一起,并对外隐藏实现细节」——正确。
class 与 struct 的唯一区别$$ \boxed{\texttt{class} \text{ 的成员默认 } \texttt{private},\texttt{struct} \text{ 的成员默认 } \texttt{public}} $$
除此之外两者完全一样——struct 里也能写函数、也能继承。
#include<iostream>
using namespace std;
class C { int x; }; // x 默认 private
struct S { int x; }; // x 默认 public
int main() {
S s;
s.x = 5; // ✅ struct 默认 public,可以直接访问
cout << s.x << endl;
// C c; c.x = 5; // ❌ 编译错误:'int C::x' is private within this context
return 0;
}
输出:5(实测验证 ✅)
注释掉的那一行如果放开,g++ 的报错是:
error: 'int C::x' is private within this context
| 修饰符 | 谁能访问 |
|---|---|
public |
所有人(类内、派生类、类外) |
protected |
类内 + 派生类(类外不行) |
private |
只有类内(派生类和类外都不行) |
2026 年 6 月六级单选第 3 题(2026 年 3 月第 3 题几乎相同):下面代码在 main() 中有一行会导致编译错误,请找出来。
#include<iostream>
#include<string>
using namespace std;
class Student {
public:
Student(string n, int s) : name(n), score(s) {}
string getName() {
return name;
}
void setScore(int s) {
score = s;
}
private:
string name;
int score;
};
int main() {
Student stu("Tom", 85);
cout << stu.getName() << endl; // ① ✅ getName 是 public
stu.setScore(90); // ② ✅ setScore 是 public
// stu.score = 100; // ③ ❌ 编译错误!score 是 private
cout << stu.getName() << endl; // ④ ✅
return 0;
}
输出:Tom / Tom(实测验证 ✅,第 ③ 行已注释)