GESP 六级 第 09 讲:面向对象与类

本讲定位:六级最独立、也最容易拿满的一块。和前八讲的算法毫无关系,纯粹是 C++ 语法。

真题分布三年几乎不变:单选第 1~3 题固定考面向对象,判断题再出 1~2 条,合计 8~10 分。而且考的点非常集中——构造函数不能是虚函数、private 成员在类外访问会编译错、虚函数实现多态、析构函数要不要 virtual,来来回回就这几条。

本讲的目标很明确:只讲考过的,背熟就全拿。 不讲运算符重载、友元、模板、纯虚类——这些三年真题一次都没考过。

对应官方大纲:六级知识块 5「面向对象」——面向对象思想、类的创建和初始化、类的特性(继承、封装、多态)。

前置知识:四级第 03 讲(结构体)。

代码说明:本讲代码均已用 g++ 11.5(-std=c++11)编译运行验证;故意写错的那几行一律用注释标出,文中给出 g++ 的真实报错原文(已在本机编译复现)。


1. 类与对象

四级学过结构体 struct,类 class 就是「能装函数的结构体」。

概念 是什么 类比
类(class) 一个模板、一张图纸 「学生」这个概念
对象(object) 按图纸造出来的实例 具体的「小杨」这个学生
成员变量 对象里存的数据 姓名、分数
成员函数(方法) 对象能做的事 查分、改分

⚠️ 判断题原题(2025 年 12 月六级判断第 2 题,官方答案「对」):「面向对象编程中,封装是指将数据和操作数据的方法绑定在一起,并对外隐藏实现细节」——正确。

1.1 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

2. 封装与访问控制 ★(单选第 3 题三年连考)

修饰符 谁能访问
public 所有人(类内、派生类、类外)
protected 类内 + 派生类(类外不行)
private 只有类内(派生类和类外都不行)

2.1 真题原型

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(实测验证 ✅,第 ③ 行已注释)