面试问题(8):大华客户端面经

1、多态,必问
2、析构函数、虚函数
3、STL,vector扩容,问了个元素是怎么从旧内存空间拷贝到新内存空间的,这好像之前没有注意过
4、问了大数据量情况下怎么提高拷贝效率
5、对于进程和程序怎么理解
(1)进程是一个动态的概念,是程序的一次执行过程;而程序是静态的,是存放在磁盘的可执行文件,是一系列指令集合。
(2)进程具有并发性,而程序没有。
(3)进程是资源分配和调度的独立单位,其并发性受系统约束。
(4)一个程序多次执行,对应多个程序;不同进程可以包含于一个程序。

6、单例模式,如何确保只实例化一个对象
(1)构造函数、拷贝构造函数、拷贝赋值运算符定义为私有的,让单例类自身管理对象的实例化。
(2)多线程环境下上锁防止实例化多个对象

7、遇见死锁或者程序崩溃情况如何解决
gdb工具调试:
(1)调试崩溃
gdb绑定程序运行崩溃时,gdb会停留在程序最后运行栈位置,一般输入bt查看堆栈,frame n切换栈帧,print打印是否空指针导致崩溃,where查看对于源码位置或者list列出源代码,崩溃一般有空指针,数组越界,内存非法访问。

(2)调试死锁
程序出现死锁时会是卡死状态,如果gdb绑定运行使用ctrl+c中断程序,输入info threads查看所有线程,使用thread n切换线程,在线程中输入bt查看线程堆栈,定位程序停留位置,查看哪些线程在等待锁,一般比较多个线程锁或者是否有死循环。

当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等待对方释放锁,在没有外力的作用下,这些线程会一直相互等待,就没办法继续运行。

8、还有一两个操作系统和数据库的忘记了。
作者:论如何收获offer
链接:https://www.nowcoder.com/discuss/353158453692669952
来源:牛客网

  1. C++三大特性

C++为了更好的实现面向对象的编程思想,于是引入了新的数据类型——类。由此衍生出三大特性:(1)封装。(2)继承。(3)多态。

封装

C++类将类中成员分为三种属性:private、protected、public

(1)私有成员(变量和函数)只限于类成员访问,由private限定;

(2)公有成员(变量和函数)允许类成员和类外的任何访问,由public限定;

(3)受保护成员(变量和函数)允许类成员和派生类成员访问,不允许类外的任何访问。所以protected对外封闭,对派生类开放。

C++这样做都是有道理的,实现了很好的封装,这就是C++的第一个重要特性:封装。

继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。

当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。

多态

基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。多态的实现机制为虚函数。

虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。

方法是在基类中为同名函数添加关键字virtual

  1. 多态的实现原理,虚函数是怎么实现的

多态的实现机制为虚函数。

C++实现虚函数的原理是虚函数表+虚表指针。

当一个类里存在虚函数时,编译器会为类创建一个虚函数表,虚函数表是一个数组,数组的元素存放的是类中虚函数的地址。

同时为每个类的对象添加一个隐藏成员,该隐藏成员保存了指向该虚函数表的指针。该隐藏成员占据该对象的内存布局的最前端。

所以虚函数表只有一份,而有多少个对象,就对应多少个虚函数表指针。

  1. 容器用过哪些,底层是什么

(1)vector:底层数组
(2)list:底层双向链表
(3)unordered_map:底层哈希表
C++ STL 标准库中,不仅是 unordered_map 容器,所有无序容器的底层实现都采用的是哈希表存储结构。更准确地说,是用“链地址法”(又称“开链法”)解决数据存储位置发生冲突的哈希表。
(4)map:底层红黑树,红黑树从平衡二叉树发展过来,通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL

  1. map的底层,存储的是什么
    红黑树。键值对。

  2. tcp/ip四层协议分别是什么

  3. 指针和引用的区别
    (1)指针是实体,占用内存空间;引用是别名,与变量共享内存空间。
    (2)指针不用初始化或初始化为nullptr;引用定义时必须初始化。
    (3)指针中途可以修改指向;引用不可以。
    (4)指针可以为NULL;引用不能为空。
    (5)sizeof(指针)计算的是指针本身的大小;而sizeof(引用)计算的是它引用的对象的大小。
    (6)如果返回的是动态分配的内存或对象,必须使用指针,使用引用会产生内存泄漏。
    (7)指针使用时需要解引用;引用使用时不需要解引用‘*’。
    (8)有二级指针;没有二级引用。

作者:蒋豆芽
链接:https://www.nowcoder.com/discuss/353158143079292928
来源:牛客网

1.在C/C++中static有什么用途?
2.引用与指针有什么区别,指针概念?
3.进程与线程区别,他们之间通信方式。安全性问题,锁等,最好结合自己项目来说。
4.重写与重载,虚函数,多态?
5.STL标准库中vector、list、map可能会问到底层实现和他们特点索引等。
6.栈和堆,队列问题。
7.几种排序中,熟记两到三种。
8.TCP/UDP区别,TCP怎样建立连接。最大传输单元。
9.http和https区别,协议中基本的命令。
10.socket网络编程
11.new和malloc区别
12.结构体和类
13.MYSQL中常见的查询语句,几种链接查询方式。
14面试官最爱问在项目中遇到的什么问题,怎样解决的。

作者:牛客904744160号
链接:https://www.nowcoder.com/discuss/353157297952202752
来源:牛客网

  1. 自我介绍
  2. 介绍项目,问一些项目里面的内容
  3. ping命令用的什么协议,有什么用
  4. shared_ptr什么情况下会增加计数,传引用会增加计数吗,为什么
  5. 嵌入式开发要注意什么问题(项目里面有涉及)
  6. linux内存管理,虚拟内存和物理内存怎么理解的
  7. 平时还看什么专业书籍
  8. 有没有发表什么文章
  9. 假如让你写一个memcpy函数,有哪些需要注意的地方?

作者:CCNUShallWe
链接:https://www.nowcoder.com/discuss/353156860129779712
来源:牛客网

  1. 内存泄漏了解吗?(引到项目方面)

  2. 怎么发现内存泄漏?
    参考:QT下类未指定父对象,导致内存泄漏,可增加关键词 Qt::WA_DeleteOnClose
    推荐:https://blog.csdn.net/a844651990/article/details/78814076
    https://blog.csdn.net/iot_shun/article/details/79942743

  3. QT下多线程操作ui句柄,会发生什么?怎么发现QT下多线程无法操作ui句柄?
    参考:在QT中,子线程是无法直接操作UI的,否则会报错,会出现线程冲突之类的错误。
    https://blog.csdn.net/wangzhezhilu001/article/details/100715796

  4. C++引用?

  5. 析构函数可以声明为虚函数吗?目的为了什么?

  6. 析构函数忘记声明为虚函数,会引起什么问题?(面试官回答了)

  7. QSS有没有接触过?(但是后面想到了,说了用过,但是比较少)

  8. QT下的model view了解吗?
    9.网络相关知识了解吗?(引到了项目上面)

  9. TCP/UDP?(讲解TCP的项目,碰到的问题,解决方式,成果)

  10. 你自己偏向于哪个方向?

  11. 平时看哪些书籍(APUE必推哈哈哈,把书籍摆在书桌上,挨个念,但是怕真的问我书籍里面的相关知识!!)
    13.反问

作者:Tavi
链接:https://www.nowcoder.com/discuss/353157035422326784
来源:牛客网

你可能感兴趣的:(面试,java,职场和发展)