准备C++考试时,很多人会发现题目类型五花八门,但其实大部分考试都围绕几个核心题型展开。了解这些题型,能帮你更有针对性地复习。
选择题:考基础语法和细节
这是最常见的题型,比如问你sizeof(int)在64位系统下的结果,或者const关键字的用法。这类题看似简单,但容易掉坑。比如下面这段代码:
#include <iostream>
using namespace std;
int main() {
const int a = 5;
int* p = const_cast<int*>(&a);
*p = 10;
cout << a << endl;
return 0;
}
输出可能是5也可能是10,取决于编译器优化。考试中常拿这种“未定义行为”来设陷阱。
填空题:补全关键代码
这类题喜欢出现在函数模板或类定义中。比如让你补全一个拷贝构造函数:
class MyClass {
private:
int* data;
public:
MyClass(const MyClass& other) {
data = new int(*other.data); // 填这里
}
};
如果你写成data = other.data;,那就错了,浅拷贝会导致后续问题。
程序阅读题:看懂别人写的代码
给一段带继承和多态的代码,问输出结果。比如:
class Base {
public:
virtual void show() { cout << "Base"; }
};
class Derived : public Base {
public:
void show() override { cout << "Derived"; }
};
Base* p = new Derived();
p->show();
输出是Derived,因为是虚函数。如果去掉virtual,结果就变了。
编程题:动手写小功能
通常要求实现一个函数,比如反转链表、实现智能指针的简易版本。别写得太复杂,考试看重的是边界处理和内存管理。例如写个unique_ptr的简化版:
template<typename T>
class MyPtr {
T* ptr;
public:
explicit MyPtr(T* p) : ptr(p) {}
~MyPtr() { delete ptr; }
T& operator*() { return *ptr; }
T* operator->() { return ptr; }
};
注意析构函数里加判断if(ptr)更安全,但考试中不加也可能得分。
平时练习时可以模拟考试环境,限时做题。很多人在IDE里写得好好的,一上考场手写就漏分号、错大小写。建议拿纸笔多练几遍典型题,尤其是指针和引用相关的。