GESP 六级 · GESP 202309 C++ 六级 第 5 题

选择题 · 答案 D

← 整套速查表 GESP 六级 全部真题

题目

有关下面 C++ 代码的说法,错误的是( )。

#include <iostream>
#include <string>
using namespace std;

class MyStr {
    string data;
public:
    MyStr(string _data): data(_data) {}
};

int main() {
    MyStr st("ABC");
    cout << st << endl;
    return 0;
}
答案:D

解题思维

这题考C++类的封装性与运算符重载。拿到题先看类定义里成员变量data是public还是private,再看cout输出缺重载是否报错,最后验证访问私有成员是否合法。

常见错误

最容易掉进D选项的陷阱,以为类里有data成员就能直接输出,忽略了private访问权限导致编译错误;还会把A选项的运算符重载规则记反,误以为没有重载cout就会输出默认值。

详细解析(节选)

【考点】类成员访问权限|运算符重载|封装性

这题是GESP六级C++面向对象章节的经典陷阱题,命题人把“封装性”拆成“成员变量声明”和“外部访问权限”两刀,专门卡住那些只背类结构、不懂访问控制的同学。

先看代码结构:第6行string data;定义了一个私有的成员变量(默认private),第7行构造函数把传入的字符串赋值给它。第11行cout << st.data试图访问这个私有成员。这里有个关键细节:cout << st会调用operator<<重载,但cout << st.data不仅涉及重载,还涉及成员访问权限。

逐项分析选项: A选项说cout << st会报错,因为没有重载<<运算符。这是对的,C++标准库的ostream没有为自定义类型定义重载,所以编译会报错。 B选项说第6行data是成员变量,这也是对的,类定义里的变量默认就是成员变量。 C选项说构造函数会执行,同样正确,MyStr st("ABC");直接调用构造函数初始化对象。 D选项说cout<< st.data可输出ABC。这是错的,因为data是private成员,外部代码无法直接访问,这行代码编译就会报错,更谈不上输出什么。命题人利用初学者“有成员就能用”的直觉,把权限控制藏进cout << st.data这行看似合法的语法里,如果你只背“类有成员变量就能输出”,就会掉进这个坑。

【命题视角】这类题在GESP六级出现频率很高,命题人喜欢用“看似能运行实则编译不过”的选项来测试学生对C++语法的严谨理解。D选项就是典型的反例,它把“成员存在”和“成员可访问”混淆在一起。

【考频趋势】基础语法在题库里考过1295题,覆盖11个级别,2023年有287题、2024年413题、2025年401题,近年明显增加;字符串考了99题,六级占17题;字符数组与字符串处理考了107题,六级占15题。组合数学和排列组合基础在六级也占了不少比重,六级组合数学26题、排列组合26题,说明六级越来越重视算法与语法的结合。

【预测】基于数据,未来六级会继续加大“类成员访问权限”与“运算符重载”的交叉考查,尤其是把私有成员藏在看似合法的表达式里,比如cout << obj.member这种形式。如果数据不足以支撑,就按经验判断:这类陷阱题在六级至少会保持每年1-2题的密度,命题人不会轻易放弃对语法严谨性的测试。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断