去哪儿 客户端开发-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++工程能力.

全部评论

相关推荐

03-04 07:14
门头沟学院 C++
黑皮白袜臭脚体育生:老板:都给工作机会了还想要工资,哪来这么多好事
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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