面试技术题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yt_42370304/article/details/84036125

最近在找工作,这是一次被动的找工作,有史以来时间最长的一次.也有第一在上海这个城市换工作,大概花了将近一个半月的时间.这期间也有部分offer,但是都不是很理想.

  1. 猎头推荐
    我发现这里的猎头推荐的比较多.猎头会打电话过来说有哪哪的职位给推荐.问了一堆的信息,简历上有的东西还要跟你确认一遍.还非要加微信.然后说有消息了再通知.就没有后续了. 这种感觉像是收集信息的.不否认也有靠谱的.
  2. HR预约面试
    HR直接打电话约面试的,说我们技术已经看了你的简历感觉挺匹配的.所以想约您面试. 在面试过程中,我感觉聊的不错,面完就直接让回来等消息.一般我都会问多久有反馈. 结果有的就直接没信了还有的个反馈没有个相关经验.
    第二种最气人了. 根本没有看简历. 如果没有相关经验干嘛还让面试呢.
    我觉得有些公司根本不打算招人,或是看看市场动态的,如果碰到特别优秀的兴许也会考虑.
  3. 电话面试
    人事直接预约电话面试,技术面试. 这种方式效率略高些,但是明明不是很匹配,但是还是有的公司让你去公司面试. 但是做为应聘者肯定要抱着试试看的态度啊,如果不去就失去了一个机会. 这种公司最不负责任了.
    这段时间面试的公司,
    爱奇艺 腾讯 万得 小红书 这类公司以网络技术为主,问的TCP. UDP的技术比较多.支持大数据量的并发.做过哪些开源软件, 分布式 数据库.
    云柜 主要是C,C++. QT方面的感觉聊的不错,结果告诉不合适.
    贝锐 这个做2-3层的多些,没怎么面试.就问了一下网络的东西,解释一下网络是如何发信息的. 还有嵌入式系统的启动过程. 其他就不说了.

现在总结部分公司的招聘原则和面试技术路线.

一.C++部分

  1. 为什么将子类析构函数定义成虚函数有什么好处?
    A:防止子类的析构函数不被调用.
  2. class与struct 区别?
    A:默认访问权限不一样,class默认访问权限private. struct是public.
  3. C++智能指针有那些?都有什么区别
    A: Shared_ptr是共享型智能指针.
    weak_ptr是弱指针.配合shared_ptr一起使用.
    scope_ptr 是一个类似auto_ptr的智能指针,不能转让.一旦获得管理权,你将无法取回来.
    unique_ptr是在C++11标准中定义的新的智能指针,同样在作用域内管理指针,也不许拷贝构造和拷贝赋值.
  4. static的作用?
    A:(1)隐藏。(static函数,static变量均可)
    (2).保持变量内容的持久。(static变量中的记忆功能和全局生存期)
    (3).默认初始化为0(static变量)
    (4).C++中的类成员声明static(有些地方与以上作用重叠)
  5. 拷贝构造函数作用? 如何声明?
    A: (1).如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。  现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。
    这将造成三个错误:
    1).是b.m_data原有的内存没被释放,造成内存泄露;
    2).是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;
    3).是在对象被析构时,m_data被释放了两次。即:当含有指针时,如果调用默认的拷贝拷贝构造函数(赋值运算符),这个时候进行的浅拷贝(赋值),或者是影子拷贝,会使2个指针指向同一个内存区域,析构的时候就会出现同一个内存资源被释放2次的错误。对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
    // 拷贝构造函数
  String::String(const String &other)
  {
  // 允许操作other 的私有成员m_data
  int length = strlen(other.m_data);
  m_data = new char[length+1];
  strcpy(m_data, other.m_data);
  }
  // 赋值函数
  String & String::operate =(const String &other)
  {
  // (1) 检查自赋值
  if(this == &other)
  return *this;
  // (2) 释放原有的内存资源
  delete [] m_data;
  // (3)分配新的内存资源,并复制内容
  int length = strlen(other.m_data);
  m_data = new char[length+1];
  strcpy(m_data, other.m_data);
  // (4)返回本对象的引用
  return *this;
  } 

还要注意的是拷贝构造函数是构造函数,不返回值
而赋值函数需要返回一个对象自身的引用,以便赋值之后的操作 链式操作
6. C++11包括哪写?
A.
7. 虚函数的底层是如何实现的?
A. 编译器处理虚函数的方法是:为每个类对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,称为虚表指针(vptr),这种数组成为虚函数表(virtual function table, vtbl),即,每个类使用一个虚函数表,每个类对象用一个虚表指针。
8. SOCKET有哪写API?
A. socket, Listen. connect Accetp, recv, send.
9. 什么是菱形继承?
A. 菱形继承
假设有类B和类C,它们都继承了相同的类A。另外还有类D,类D通过多重继承机制继承了类B和类C。
如果直接继承会引发访问不明确(二义性),以及数据冗余。如果直接指定访问对象,可解决二义性,而要解决数据冗余,则要引入虚函数。
因为图表的形状类似于菱形(或者钻石),因此这个问题被形象地称为菱形问题(钻石继承问题)。

A
B
C
D
  1. 什么是RAII?
    A: RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
    RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。
    这种做法有两大好处:
    不需要显式地释放资源。
    采用这种方式,对象所需的资源在其生命期内始终保持有效。
  2. explicit关键字的作用?
    A:防止构造函数做隐式转换.
  3. volatile 关键字的作用?
    A: volatile关键字试图阻止过度优化
    (1).阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回.
    (2).阻止编译器调整操作volatile变量的指令顺序.
  4. 什么是左值和右值?
  5. 在构造函数和析构函数中调用虚函数有什么影响?
  6. C的struct和C++struct的区别?
    A: C中的struct中只能定义基本数据类型.而C++中可以定义成员函数.
  7. C++为什么字节对齐?
  8. C++ 强制类型转换有哪几个?都有什么区别?
  9. select poll和epoll 区别?
  10. epoll的实现API?

二.数据结构

  1. Vector和List区别?
  2. 为什么Vector申请内存空间是2倍?
  3. 链表反转?
  4. 如何判断链表中有环?
  5. Map是如何实现的?

三.网络部分

  1. TCP和UDP区别?
  2. TCP三次握手的实现?
  3. 为什么会有三次握手?
  4. TCP四次握手的实现?
  5. 为什么会有time_wait状态?
  6. 什么是快重传?
  7. 什么是慢启动?
  8. 如何用UDP协议实现可靠性?
  9. SSH免密原理?

四.设计模式

  1. 面向对象的设计原则?
  2. 常用的设计模式?

五.操作系统

  1. 如何查看打开文件标识符?
  2. 进程和线程间区别?
  3. 进程间通讯? 各有什么区别?

猜你喜欢

转载自blog.csdn.net/yt_42370304/article/details/84036125