当前位置: 首页 > 面试经验 >

双非C++挑战大厂(一)百度提前批一面

优质
小牛编辑
94浏览
2023-07-29

双非C++挑战大厂(一)百度提前批一面

零.写在最开始

   转眼间八月已到,24年毕业的我也走上了秋招季。在这里开一个系列,记录我的秋招之旅。本人的背景是双非C++辅GO,两段大厂实习,两段都偏向C++架构类。简历项目是两个C++的LAB,6.S081+CS144和一个GO后端的简易抖音。

一.面试概述

   一段比较糟糕的面试体验,第一次经历了一面挂。约的五点面试,四点五十我点开邮箱链接开始等待面试官。等到五点过十分,面试官也没有上线。于是询问HR,HR说邮箱链接不对,让我用他微信发给我的链接。但是由于用的个人热点面试,导致十分卡顿,五点十五左右才开始面试。此时,面试官态度已经非常不好了。面试分为四个部分,自我介绍+八股+算法题+反问环节。C++语言基础和算法题都算答的不错,但最后到了反问环节时,才堪堪五点五十,我询问面试官部门做什么的,面试官回答"海外产品",没有更多拓展,此时我便清楚面试已经挂掉,最终以"谢谢参加面试结束"结束。微信询问hr面试情况,果然已经挂掉。但面试还有不少值得复盘的地方,当作是秋招的热身好了,下面是一些面试题和注意事项。

二.面试题

1.讲讲static关键字?
 答:static关键字的使用可以分为修饰变量和修饰函数。static修饰变量时,如果变量是全局变量,说明这个全量变量只是当前文件可见。如果变量是类属性,即该变量只会被初始化一次,且必须在类外初始化。如果变量是函数内的局部变量,变量只会在函数第一次调用时初始化,此后变量的值都延续上一次调用的值。如果static关键字修饰函数,这个函数也只是当前文件可见。如果static关键字用来修饰类内函数,该函数没有this指针,只能用来访问静态变量。

2.还有什么可以拓展的吗,static变量存储在哪,和局部变量存储位置有什么区别?
 答:static变量存储在堆区,堆区是动态存储区,由程序员手动申请和手动释放。局部变量存储在栈区,栈区主要和函数调用相关,栈区由操作系统自动管理。

补充:static全局变量一般来说存储在静态存储区。如果static全局变量未初始化,存储在bss段;初始化后存在data段。但static全局变量的存储位置和编译器优化相关,也可能存储在堆区。

3.堆区都是手动释放?
答:也不一定,主要看使用方法。如果使用的函数是malloc,new之类,就需要手动释放,不然会造成内存泄漏。但是如果我们使用智能指针,智能指针会自动释放内存,因为智能指针基于类自动调用析构函数实现了内存的自动释放。

4.介绍一下map容器?
答:map支持kv键值对的查找,底层基于红黑树,查询和插入的时间复杂度都是logn。因为底层基于红黑树,map的key是有序的,所以map容器为我们提供了一些有序的api,比如对key的二分查找(lower_bound)。与此同时,我们还有unoredered_map,这个容器是哈希表,查询和插入的时间复杂度是O(1),但是如果遇上哈希冲突,复杂度可能退化到O(n)。这个容器的key是无序的。unordered_map的使用的常数时间是要比map快一到两倍。

5.C++11有哪些新特性?
答:C++11有许多新特性,例如上文我们提到的智能指针,实现了对堆区的动态管理。还有右值语义和完美转发之类的,右值语义基于移动构造函数,使用时可以减少不必要的拷贝。

C++11引入了很多新特性,包括但不限于以下几点:
1.自动类型推导:使用关键字 auto 可以让编译器自动推导变量的类型。
2.Lambda表达式:可以在函数内部定义匿名函数,从而方便地实现函数对象。
3.右值引用和移动语义:使用 && 可以表示右值引用,引入了移动构造函数和移动赋值运算符,可以减少不必要的拷贝。
4.初始化列表:使用 {} 可以方便地初始化数组、结构体、类等对象。
5.静态断言:使用关键字 static_assert 可以在编译时检查一个表达式是否为 true。
4.智能指针:引入了 std::unique_ptr、std::shared_ptr 等智能指针,方便地进行动态内存管理。
5.新的容器和算法:引入了 std::array、std::forward_list、std::unordered_map、std::move 等新特性,增强了容器和算法库的功能。

6.聊一聊你理解的移动构造函数?
答:移动构造函数本质上是基于指针的拷贝,实现对堆区内存所有权的移交,在一些特定场景下,可以减少不必要的拷贝。比如用一个临时对象或者右值对象初始化类实例时。我们可以使用move()函数,将一个左值对象转变为右值对象。

7.那c++有哪些构造函数呢?
答:默认构造函数,有参构造函数,拷贝构造函数,移动构造函数。

8.讲一讲const关键字。
答:const关键字在C++11之前,具有只读和常量两个语义。在C++11,引入constexpr关键字之后,const语义固定在了只读,constexpr固定为常量,但总而言之,这个两个关键字核心的语义是,指向的内容不可更改。

const 关键字用于指定变量或对象的值是不可修改的。它可以用于修饰变量、函数参数、函数返回值和成员函数等。 constexpr 关键字用于指定表达式在编译时就能够被计算出结果,从而产生一个编译期常量。它可以用于修饰变量、函数、类和模板等。constexpr 的作用是在编译时进行计算,从而提高程序的性能。

9.那const指向地址呢?
答:const指向的地址值不可更改,但是地址对应的内容是可更改的。

10.虚函数是什么,重载和重写的关系。
答:虚函数涉及到C++的多态。当、在基类中声明一个虚函数,在派生类中重写该函数,可以实现动态绑定。在运行时,程序会根据具体对象的类型调用相应的函数。重写要求函数签名完全一致,即函数名,函数变量和返回值完全一致,但是函数体可以不同。重写是运行时多态,也就是动态多态。重载是函数名相同,返回值和函数参数可以不同,重载是编译时多态,即静态多态。

11.讲讲你理解的虚基类。
答:C++的虚基类类似Java的抽象类,是不可以实例化的。

虚基类是 C++ 中一种特殊的类,用于解决多继承所带来的"菱形继承"问题。如果一个派生类同时从两个基类派生,而这两个基类又共同继承自同一个虚基类,就会形成一个"菱形"继承结构,导致派生类中存在两份共同继承的虚基类的实例,从而引发一系列的问题。为了解决这个问题,我们可以将虚基类作为共同基类,并在派生类中采用虚继承的方式。虚继承会使得派生类中只存在一份共同继承的虚基类的实例,从而避免了多个实例之间的冲突。虚基类是可以被实例化的。

12.讲一讲四次挥手?
答:TCP的四次挥手分为主动关闭方和被动关闭方。主动关闭方因为自身的stream结束,主动发送了FIN报文,为第一次挥手。被动关闭方发送对第一次挥手确认的ACK报文,这为第二次挥手。接着被动方的stream结束,发送FIN报文,此为第三次挥手。最后,主动关闭方发送ACK报文对第三次挥手进行确认,为第四次挥手。

13.为什么是四次挥手,不能是两次挥手吗? 答:因为发送方发送完FIN报文之后,需要对方回复ACK报文表示:发送方的FIN报文被接收方确认已经收到。所以一定需要四次挥手。如果只有两次挥手,主动关闭方和被动关闭方分别发送FIN报文,不接受ACK报文。主动关闭方和被动关闭方无法知道发送的FIN报文被对方收到,因为FIN报文可能在网络中遗失了。

14.讲讲close_wait状态和last_ack状态的区别?
答:这两个状态都是被动结束方的状态,被动结束方接收第一次挥手,从establish状态变成close_wait状态。接着。被动结束方发送第二次和第三次挥手,从close_wait状态转变到last_ack状态。在last_ack状态,被动结束方等待主动结束方的第四次挥手。其中,第二次和第三次挥手之间,需要程序员触发close()。

15.如果在time_wait状态点击read会怎样?
答:在 TIME_WAIT 状态下,如果尝试进行读取操作,会返回一个错误码,表示连接已经关闭。因为在这个状态下,连接已经被完全关闭,不能再进行数据传输。因此,如果在 TIME_WAIT 状态下尝试进行读取操作,很可能会导致读取失败,并返回一个错误码。

这个我不太懂,请大家解答

16.HTTP请求有哪些方法,GET和 POST方法有什么区别?
答:HTTP请求有head,get,post方法。其中GET方法语义倾向于下载,post倾向于上传。

17.会mysql和redis吗
答:只是会简单的使用,深度比较浅。

18.算法题:合并两个升序链表。十分钟秒了。

三.复盘

  • 面试挂掉的一个重要原因是链接问题+网络问题。以后还是要谨记不要用个人热点面试
  • 面试匹配度不高,部门开发是GO后端。GO和数据库我只会简单的使用,没有背过八股,这里问题也比较大。

本系列我会一直连载。如果面试题有错误,欢迎大家斧正,祝大家秋招顺利!

#提前批##大厂##百度##面试#
 类似资料: