有关下面 C++ 代码的说法,错误的是( )。
#include <iostream>
using namespace std;
class MoreData {
int * __data;
int head, tail, capacity;
public:
MoreData(int cap) {
capacity = cap;
__data = new int[capacity];
head = tail = 0;
}
MoreData & push(int val) {
__data[tail++] = val;
return *this;
}
int pop() {
return __data[head++];
}
int size() {
return tail - head;
}
};
int main() {
auto myData = MoreData(100);
myData.push(1);
myData.push(2);
myData.push(3);
myData.push(11).push(12).push(13);
cout << myData.pop() << endl;
return 0;
}这题考的是运算符重载里‘返回引用’的妙用。拿到题先看 push 的声明,它返回 MoreData&,这意味着每次 push 后对象依然可用,从而支持第 29 行那种链式调用,这是解题的突破口。
学生最容易把 push 当成普通函数,误以为它返回 void 或临时对象,进而认为连续调用会报错。有的考生看到__data 前面带了双下划线,就紧张地以为这是某种特殊语法导致访问受限,其实那只是命名习惯。还有人会纠结 pop 返回的是 int 还是引用,觉得返回值类型可能影响链式调用,其实只要 push 返回引用就能解决这道题。
【考点】运算符重载|引用返回值与链式调用|队列实现原理|私有成员命名规范
首先明确这道题考查的是 C++ 类设计中‘返回引用’这一高级技巧,以及由此带来的链式调用能力。命题人特意在 GESP 六级设置这类题,就是要区分考生是否真正理解函数返回值的语义——是返回一个临时拷贝,还是返回原对象的引用。很多考生背过‘push 返回 void’这种结论,一旦看到连续调用就慌了,这就是掉进坑里的典型表现。
解题心法:拿到题先别急着看选项,先把 push 函数签名读透。MoreData & push(int val) 中的 & 符号意味着返回的是 MoreData 对象的引用。引用和指针一样,不会创建新对象,而是直接指向被调用的那个 myData。所以 push(11) 执行完后,整个表达式 myData.push(11) 的值就是 myData 本身(引用),紧接着 .push(12) 就能合法地在这个对象上继续执行。这就是为什么第 29 行 myData.push(11).push(12).push(13) 完全合法,根本不会报编译错误。反过来想,如果 push 返回的是 void 或临时对象(比如 MoreData),那么 .push(12) 就会因为找不到成员函数而报错,题目就会变成‘哪一行有问题’。
再看其他选项验证思路。A 选项说 MoreData 可用于构造队列,这完全正确。代码里有 head 和 tail 两个指针,size() 返回 tail-head,pop() 从 head 开始取,push() 向 tail 方向放,这就是标准的 FIFO 队列实现,和 C++ 标准库的 std::queue 原理一致。C 选项说__data 是私有成员,只能在类内访问,这也是对的。虽然__data 前面加了双下划线,但这只是命名习惯(防止与 std 库冲突),并不改变它的访问权限,它确实只在 MoreData 类内部被 push、pop、size 访问,类外无法直接取用。D 选项说以上均无错误,既然 B 明显错误,D 自然也是错的——但题目问的是‘错误的是’,所以正确答案只能是 B。
避坑提醒:学生最容易在两个地方栽跟头。一是看到连续 push 就下意识认为语法错误,忽略了返回引用这个核心细节;二是看到__data 的双下划线就过度联想,以为这是某种特殊语法导致访问受限,其实那只是命名约定。此外,有些考生会纠结 pop 返回的是 int 而不是引用,觉得返回值类型可能影响链式调用,其实只要 push 返回引用就能解决这道题,pop 的返回值类型不影响本题的判断。
考频趋势方面,从题库数据看,‘基础语法’类题目共考过 1295 题,覆盖 11 个级别,其中 2023 年考了 287 题,2024 年 413 题,2025 年 401 题,2026 年 109 题,呈现逐年上升后回落的趋势,说明这类综合语法题在近年考试中占比很大。‘队列(queue)'专题共考过 46 题,其中 GESP 六级就占了 31 题,2024 年考了 12 题,2025 年 13 题,2026 年 9 题,说明队列相关题型在六级中高频出现,且每年都有稳定考量。‘栈(stack)'专题共 89 题,GESP 六级考了 37 题,2024 年 25 题,2025 年 15 题,2026 年 9 题,可见栈和队列是六级必考的数据结构基础。
基于这些数据,可以预测未来 GESP 六级继续侧重‘运算符重载与链式调用’这类综合语法题,尤其是结合队列、栈等数据结构实现的题目,因为这类题既能考察语法细节,又能体现对数据结构原理的理解,符合六级对进阶能力的要求。暂无足够依据预测是否会突然转向其他冷门语法点,但‘返回引用’这类考点在近年考试中热度稳定,大概率仍是命题人的宠儿。