C++ 从 0 入门(六)|C++ 面试必知:运算符重载、异常处理、动态内存进阶(终极补充)

张开发
2026/4/19 2:46:37 15 分钟阅读

分享文章

C++ 从 0 入门(六)|C++ 面试必知:运算符重载、异常处理、动态内存进阶(终极补充)
大家好我是网域小星球。本篇是 C 面试补充的最后一篇聚焦3 个面试高频进阶考点—— 运算符重载、异常处理、动态内存进阶都是基础面试中 “拉开差距” 的知识点也是笔试常考的手撕题。学完这两篇补充你的 C 面试基础会更扎实轻松应对面试官的延伸提问代码全部 VS2022 可运行。目录一、核心学习目标面试导向二、运算符重载笔试手撕高频面试必问1. 核心概念2. 核心规则面试必背3. 常用运算符重载笔试手撕示例示例 1重载 运算符成员函数示例 2重载 运算符友元函数高频面试常问三、异常处理try-catch-throw面试必问1. 核心作用2. 核心语法面试必背面试常问四、动态内存进阶new/delete、智能指针面试高频1. C 动态内存管理new/delete替代 C 语言 malloc/free核心区别面试必问代码示例面试坑点2. 智能指针入门面试高频了解即可核心作用常用智能指针面试必记代码示例unique_ptr最基础面试常问五、本章核心总结面试速记一、核心学习目标面试导向掌握运算符重载语法 常用重载笔试手撕题理解异常处理try-catch-throw面试必问用法吃透动态内存进阶new/delete、智能指针入门避免内存泄漏掌握三大知识点的面试标准答案和代码写法二、运算符重载笔试手撕高频面试必问1. 核心概念C 允许重载运算符如 、-、*、、 等让自定义类的对象能像内置类型int、double一样使用运算符提高代码简洁性。2. 核心规则面试必背不能重载的运算符牢记.、.*、::、? :、sizeof重载运算符的优先级、结合性与原运算符一致运算符重载本质是函数分为成员函数重载和友元函数重载。3. 常用运算符重载笔试手撕示例示例 1重载 运算符成员函数实现两个 Person 对象的年龄相加#include iostream #include string using namespace std; class Person { public: int age; Person(int a) { age a; } // 重载 运算符成员函数 Person operator(const Person p) { Person temp(0); temp.age this-age p.age; // this指向当前对象 return temp; } }; int main() { Person p1(20), p2(18); Person p3 p1 p2; // 等价于 p1.operator(p2) cout 年龄和 p3.age endl; // 输出38 return 0; }示例 2重载 运算符友元函数高频实现 cout 直接输出自定义对象笔试常考class Person { private: string name; int age; // 友元函数重载 friend ostream operator(ostream cout, const Person p); public: Person(string n, int a) : name(n), age(a) {} }; // 友元函数重载 类外定义 ostream operator(ostream cout, const Person p) { cout 姓名 p.name 年龄 p.age; return cout; // 返回cout支持链式输出如cout p1 p2 } int main() { Person p(张三, 20); cout p endl; // 直接输出对象等价于 operator(cout, p) return 0; }面试常问为什么 运算符重载要用友元函数答因为 cout 是 ostream 类的对象若用成员函数重载左操作数必须是当前类对象如 p cout不符合使用习惯友元函数可让左操作数是 cout右操作数是自定义对象符合常规用法。三、异常处理try-catch-throw面试必问1. 核心作用捕获程序运行时的异常如除 0、数组越界、动态内存申请失败避免程序直接崩溃提高程序健壮性。2. 核心语法面试必背try { // 可能出现异常的代码 throw 异常值; // 抛出异常 } catch (异常类型1) { // 捕获并处理异常类型1 } catch (异常类型2) { // 捕获并处理异常类型2 } catch (...) { // 捕获所有类型异常兜底 }3. 代码示例面试常考场景#include iostream using namespace std; // 除法函数抛出除0异常 int divide(int a, int b) { if (b 0) { // 抛出异常可抛出任意类型int、string等 throw 除0错误; } return a / b; } int main() { int x 10, y 0; try { int res divide(x, y); // 可能出现异常 cout 结果 res endl; } catch (const char* err) // 捕获char*类型异常 { cout 异常捕获 err endl; // 输出异常信息 } catch (...) // 兜底捕获所有未匹配的异常 { cout 未知异常 endl; } // 异常处理后程序继续执行不会崩溃 cout 程序正常执行完毕 endl; return 0; }面试常问C 异常处理的优点答分离异常检测和异常处理代码提高代码可读性、可维护性避免程序直接崩溃增强程序健壮性。throw 抛出的异常必须被 catch 捕获吗答不一定若未被 catch 捕获会调用系统默认异常处理函数程序依旧会崩溃。四、动态内存进阶new/delete、智能指针面试高频1. C 动态内存管理new/delete替代 C 语言 malloc/free核心区别面试必问对比维度new/deleteCmalloc/freeC本质运算符不是函数库函数类型检查有严格类型检查无类型检查返回 void*构造 / 析构自动调用构造 / 析构不调用需手动初始化 / 释放内存分配直接分配对应类型内存需手动计算内存大小代码示例#include iostream using namespace std; class Person { public: Person() { cout 构造调用 endl; } ~Person() { cout 析构调用 endl; } }; int main() { // 1. 动态分配单个对象 Person* p1 new Person; // 自动调用构造 delete p1; // 自动调用析构释放内存 p1 nullptr; // 置空避免野指针 // 2. 动态分配数组 Person* p2 new Person[3]; // 调用3次构造 delete[] p2; // 必须加[]否则只调用1次析构内存泄漏 p2 nullptr; return 0; }面试坑点动态分配数组时delete必须加[]否则会导致内存泄漏new 申请内存失败时会抛出bad_alloc异常C11 后避免内存泄漏new 和 delete 必须成对出现最好用智能指针管理。2. 智能指针入门面试高频了解即可核心作用自动管理动态内存无需手动 delete彻底避免内存泄漏面试常问 “如何避免内存泄漏”智能指针是核心答案。常用智能指针面试必记unique_ptr独占所有权一个智能指针只能指向一个对象不能拷贝shared_ptr共享所有权多个智能指针可指向同一个对象自动计数计数为 0 时释放内存weak_ptr辅助 shared_ptr解决循环引用问题。代码示例unique_ptr最基础#include iostream #include memory // 智能指针头文件 using namespace std; class Person { public: ~Person() { cout 析构调用内存释放 endl; } }; int main() { // 智能指针自动管理内存无需手动delete unique_ptrPerson p(new Person); // 自动释放无需写delete return 0; }面试常问如何避免 C 内存泄漏答1. new 和 delete 成对出现2. 使用智能指针unique_ptr/shared_ptr3. 避免野指针及时置空4. 析构函数中释放动态内存。五、本章核心总结面试速记运算符重载让自定义对象可使用运算符 重载常用友元不能重载 5 个特殊运算符异常处理try 捕获、throw 抛出、catch 处理避免程序崩溃提高健壮性动态内存new/delete 自动调用构造 / 析构智能指针可自动管理内存避免泄漏

更多文章