深入解析:极限复习c++
一、核心语法必背
1. 指针 vs 引用(简答题高频)
| 区别 | 指针 | 引用 |
|---|---|---|
| 定义 | 存储地址的变量,可改指向 | 变量的别名,绑定后不可改 |
| 初始化 | 可空(nullptr)、延迟初始化 | 必须初始化,不能引用空值 |
| 访问 | 需解引用(*p/->) | 直接用变量名,语法同原变量 |
| 空值 | 允许nullptr | 无空引用,绑定后必有效 |
| 自增 / 减 | 支持(移动地址) | 不支持(别名不变) |
代码示例:
cpp
运行
int a = 10;int* p = &a; // 指针存地址int& ref = a; // 引用是别名 p = nullptr; // 指针可改指向// ref = nullptr; // 错误!引用不能改绑定
2. 类与对象(必写代码)
封装 + 构造 / 析构 + 拷贝控制(考频最高):
cpp
运行
class Student {private: string name; int age;public: // 构造函数(重载 + 初始化列表) Student(string n = "无名", int a = 0) : name(n), age(a) {} // 拷贝构造(深拷贝场景需手动写,如含指针成员) Student(const Student& other) : name(other.name), age(other.age) {} // 析构函数(含动态内存时必写,如指针) ~Student() { /* 释放资源 */ } // 成员函数 void print() const { cout << "姓名:" << name << ",年龄:" << age << endl; }}; // 调用示例Student zs("张三", 18);zs.print(); Student ls = zs; // 调用拷贝构造
3. 继承与多态(必写代码)
虚函数 + 纯虚函数 + 多态调用(核心考点):
cpp
运行
class Animal {public: // 纯虚函数(抽象类,强制派生类实现) virtual void speak() = 0; // 虚析构(避免派生类对象析构不完整) virtual ~Animal() {} }; class Dog : public Animal {public: void speak() override { // override 显式重写 cout speak(); // 输出“汪汪!”(运行时绑定)delete animal;
4. 模板(必写代码)
函数模板 + 类模板(语法题高频):
cpp
运行
// 函数模板(泛型交换)template void swap(T& a, T& b) { T temp = a; a = b; b = temp;} // 类模板(简单栈)template class Stack {private: vector data;public: void push(const T& val) { data.push_back(val); } T pop() { T top = data.back(); data.pop_back(); return top; }}; // 调用示例Stack s;s.push(10);int x = s.pop();
5. 智能指针(必背区别)
| 类型 | 特点 | 场景 |
|---|---|---|
unique_ptr | 独占所有权,不可拷贝 | 简单对象管理,避免资源泄漏 |
shared_ptr | 共享所有权(引用计数) | 多对象共享资源,需注意循环引用 |
weak_ptr | 弱引用(不影响计数) | 解决shared_ptr循环引用 |
代码示例:
cpp
运行
// unique_ptr(独占)unique_ptr p1 = make_unique("李四", 20); // shared_ptr(共享)shared_ptr p2 = make_shared("王五", 22);shared_ptr p3 = p2; // 引用计数+1 // weak_ptr(弱引用)weak_ptr p4 = p2; // 不影响计数
6. 异常处理(必写结构)
cpp
运行
try { // 可能抛异常的代码 if (error) throw runtime_error("出错了!"); } catch (const runtime_error& e) { // 捕获特定异常 cout << "错误:" << e.what() << endl; } catch (...) { // 兜底捕获 cout << "未知异常" << endl; }
二、简答题速记(直接背答案)
1. 指针和引用的区别(必考题)
- 定义:指针存地址,可改指向;引用是别名,绑定后不可改。
- 初始化:指针可空、延迟初始化;引用必须初始化,不能引用空值。
- 访问:指针需解引用(
*p);引用直接用变量名。 - 空值:指针允许
nullptr;引用无空引用。
2. 虚函数的实现原理(必考题)
- 虚函数表(vtable):每个含虚函数的类编译时生成虚表,存储虚函数地址。
- 虚表指针(vptr):对象构造时,vptr 指向类的虚表。
- 调用机制:通过 vptr 查表,运行时动态绑定函数(多态的核心)。
3. 拷贝构造函数的调用场景(必考题)
- 用对象初始化新对象:
Student s2 = s1;或Student s2(s1);。 - 函数按值传递对象:
void func(Student obj),调用时拷贝实参。 - 函数返回对象(值返回):
Student func() { Student s; return s; },返回时拷贝临时对象。
4. 内存泄漏及解决方法(必考题)
- 内存泄漏:动态分配的内存(
new/malloc)未释放,长期占用内存。 - 解决方法:
- 用智能指针(
unique_ptr/shared_ptr)自动管理。 - 严格配对
new/delete、malloc/free。 - 工具检测(如 Valgrind、AddressSanitizer)。
- 用智能指针(
5. 重载(overload)、覆盖(override)、重写(overwrite)区别(选考)
- 重载(overload):同一作用域,函数名相同,参数(类型 / 个数 / 顺序)不同,编译期决议。
- 覆盖(override):派生类重写基类虚函数,函数签名(名、参数、返回)完全一致,运行期多态。
- 重写(overwrite):非标准说法,常指覆盖(override)或隐藏基类函数(如派生类定义同名非虚函数)。
三、考试应急策略
- 代码题:优先写框架(类定义、函数模板结构),再补细节(构造函数、虚函数、智能指针)。
- 简答题:抓关键词(如 “虚函数表”“引用计数”“拷贝场景”),按点作答。
- 易错点:
- 多态必须用虚函数 + 基类指针 / 引用。
- 智能指针注意
unique_ptr不可拷贝,shared_ptr需避免循环引用。 - 模板代码记得写
template <typename T>。
最后 1 小时:快速过一遍必背代码(类、多态、模板)和简答题答案,强化肌肉记忆!
祝考试顺利,代码全 AC !
浙公网安备 33010602011771号