去哪儿 客户端开发-C++ 一面

1. 自我介绍

2. HTTP 和 HTTPS 的区别

答案:HTTP 是明文传输,请求和响应内容如果被截获,理论上都可以直接看到。HTTPS 是在 HTTP 的基础上加了 TLS/SSL,加密之后再传,所以安全性更高。HTTPS 除了加密,还会做身份校验和完整性保护,能防止中间人攻击、数据篡改这些问题。代价就是握手流程更复杂,建连成本会比 HTTP 高一点,但现在实际业务里基本都优先 HTTPS。如果继续往下问,可以顺着讲 TLS 握手、证书校验、对称加密和非对称加密怎么配合。

3. HTTP 状态码,404 是什么情况下出现的

答案:HTTP 状态码一般分五类,1xx 是信息响应,2xx 是成功,3xx 是重定向,4xx 是客户端请求问题,5xx 是服务端错误。常见的像 200 OK301/302403 Forbidden404 Not Found500 Internal Server Error404 的意思是服务端收到了请求,但是找不到对应资源。常见场景有路由不存在、接口地址写错、静态资源被删除、CDN 或网关映射没配对、前后端路径不一致。它不一定代表服务挂了,更多是“你访问的那个东西不存在”。

4. C++ try catch 如何使用

答案:try catch 是 C++ 的异常处理机制。把可能抛出异常的代码放进 try 块里,如果发生异常,就会按类型去匹配后面的 catch。通常适合处理那些“发生概率不高,但一旦发生需要统一兜底”的错误,比如资源初始化失败、容器越界保护、业务层向上抛异常。如果要写得稳一点,通常会配合 RAII 一起用,这样即使中途抛异常,局部对象析构时也能把资源释放掉。

代码:

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

int divide(int a, int b) {
    if (b == 0) {
        throw runtime_error("divide by zero");
    }
    return a / b;
}

int main() {
    try {
        cout << divide(10, 0) << endl;
    } catch (const exception& e) {
        cout << "catch exception: " << e.what() << endl;
    }
    return 0;
}

5. C++ 里 noexcept 修饰的函数抛出了异常怎么办

答案:如果一个函数被 noexcept 修饰,理论上就承诺这个函数不会把异常传播出去。如果它内部真的抛了异常,而且这个异常没有在函数内部被捕获,那程序不会继续正常走异常传播流程,而是会直接调用 std::terminate() 终止。所以 noexcept 不是随便加的,它一般用于那些你非常确定不该抛异常的函数,比如析构函数、移动构造、某些底层基础组件接口。如果函数内部确实可能失败,要么自己在内部把异常吃掉,要么就别标 noexcept

代码:

#include <iostream>
using namespace std;

void func() noexcept {
    throw 1;
}

int main() {
    func();
    return 0;
}

6. 异常和错误码分别适合什么场景

答案:这题实际是在看你是不是会乱用异常。如果是那种正常业务分支,比如用户输入不合法、参数校验失败、接口返回失败,这种通常更适合错误码或者返回值,因为它本身就是流程的一部分。如果是那种“不应该频繁发生,但一旦发生就要强制打断当前逻辑”的问题,比如文件打开失败、初始化失败、资源构造失败,这时候异常会更合适。在工程里一般不会全靠异常,也不会全靠错误码,而是看模块边界和调用成本。底层库常常更讲究接口稳定,上层业务则更关注可控性和排错成本。

7. C++ 智能指针

答案:常见智能指针主要有 unique_ptrshared_ptrweak_ptrunique_ptr 表示独占所有权,一个资源只能有一个拥有者;shared_ptr 表示共享所有权,内部是引用计数;weak_ptr 不参与引用计数,主要用来打破循环引用。智能指针的核心价值不是“自动释放内存”这么简单,而是把资源生命周期和对象作用域绑起来,减少手动 new/delete 带来的泄露和悬空指针问题。但也不能什么地方都上智能指针,关键还是看所有权模型是不是清楚。

代码:

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

int main() {
    unique_ptr<int> p1 = make_unique<int>(10);
    shared_ptr<int> p2 = make_shared<int>(20);
    weak_ptr<int> p3 = p2;

    cout << *p1 << endl;
    cout << *p2 << endl;
    return 0;
}

8. shared_ptr 循环引用怎么解决

答案:shared_ptr 最典型的问题就是循环引用。比如 A 里有一个 shared_ptr<B>,B 里又有一个 shared_ptr<A>,那两个对象的引用计数都会一直大于 0,最后谁也析构不了。解决方式就是其中一边不要用 shared_ptr,改成 weak_ptrweak_ptr 只是观察,不拥有资源,不会增加引用计数。所以这题本质上不是语法题,而是对象关系设计题。

代码:

#include <memory>
using namespace std;

class B;

class A {
public:
    shared_ptr<

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

给我面没招了,发点面经攒攒人品~C++&nbsp;基础提问1.C++&nbsp;中的&nbsp;static&nbsp;关键字有什么作用?2.如果我写了代码去改变&nbsp;const&nbsp;修饰的变量,会发生什么事情?3.你了解指针和引用吗?4.说一下指针和引用的区别。5我有一个数字,想把它传递给某个方法,在方法内部改变这个数字的值,方法执行完后这个数字的值真的被改变了,应该用指针还是引用?如果用引用传递的话,会发生什么事?6.值传递和引用传递,哪个会改变原变量的值?7.&nbsp;struct&nbsp;和&nbsp;class&nbsp;的区别是什么?在访问控制权限上的区别?8.了解虚函数吗?9.了解深拷贝和浅拷贝吗?10.了解&nbsp;C++&nbsp;里的方法重载和方法重写吗?Python&nbsp;基础提问1.&nbsp;int&nbsp;类型和&nbsp;float&nbsp;类型的精度是多少?&nbsp;int&nbsp;值,最大能有多大?为什么没有&nbsp;int&nbsp;类型的长度限制?2.用过&nbsp;Python&nbsp;的装饰器吗?我要把一个类里面的方法声明为静态方法,要怎么写?3.知道&nbsp;property&nbsp;这种对象吗?我要获取实例的一个&nbsp;attribute,这个&nbsp;attribute&nbsp;是实时计算的,调用它本质上是执行了一个方法,你知道实现这个功能的装饰器叫什么吗?数据结构与算法基础提问1.数组和链表的区别是什么?在插入操作上的时间复杂度分别是多少?在内存存储上有什么区别?2.了解二叉树吗?比如二叉搜索树?3.经典的几种排序算法你有了解吗?你了解快排的话,讲一下快排的核心思想。4.了解归并排序吗?空间复杂度是多少?5.了解广度优先和深度优先遍历吗?6.二叉树能用这两种遍历方式,那三叉树可以用吗?7.二分查找的使用,有什么前提条件?
查看20道真题和解析
点赞 评论 收藏
分享
评论
3
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务