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
来源:牛客网
C++为了更好的实现面向对象的编程思想,于是引入了新的数据类型——类。由此衍生出三大特性:(1)封装。(2)继承。(3)多态。
封装
C++类将类中成员分为三种属性:private、protected、public
(1)私有成员(变量和函数)只限于类成员访问,由private限定;
(2)公有成员(变量和函数)允许类成员和类外的任何访问,由public限定;
(3)受保护成员(变量和函数)允许类成员和派生类成员访问,不允许类外的任何访问。所以protected对外封闭,对派生类开放。
C++这样做都是有道理的,实现了很好的封装,这就是C++的第一个重要特性:封装。
继承
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
多态
基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。多态的实现机制为虚函数。
虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。
方法是在基类中为同名函数添加关键字virtual
多态的实现机制为虚函数。
C++实现虚函数的原理是虚函数表+虚表指针。
当一个类里存在虚函数时,编译器会为类创建一个虚函数表,虚函数表是一个数组,数组的元素存放的是类中虚函数的地址。
同时为每个类的对象添加一个隐藏成员,该隐藏成员保存了指向该虚函数表的指针。该隐藏成员占据该对象的内存布局的最前端。
所以虚函数表只有一份,而有多少个对象,就对应多少个虚函数表指针。
(1)vector:底层数组
(2)list:底层双向链表
(3)unordered_map:底层哈希表
C++ STL 标准库中,不仅是 unordered_map 容器,所有无序容器的底层实现都采用的是哈希表存储结构。更准确地说,是用“链地址法”(又称“开链法”)解决数据存储位置发生冲突的哈希表。
(4)map:底层红黑树,红黑树从平衡二叉树发展过来,通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL
map的底层,存储的是什么
红黑树。键值对。
tcp/ip四层协议分别是什么
指针和引用的区别
(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
来源:牛客网
作者:CCNUShallWe
链接:https://www.nowcoder.com/discuss/353156860129779712
来源:牛客网
内存泄漏了解吗?(引到项目方面)
怎么发现内存泄漏?
参考:QT下类未指定父对象,导致内存泄漏,可增加关键词 Qt::WA_DeleteOnClose
推荐:https://blog.csdn.net/a844651990/article/details/78814076
https://blog.csdn.net/iot_shun/article/details/79942743
QT下多线程操作ui句柄,会发生什么?怎么发现QT下多线程无法操作ui句柄?
参考:在QT中,子线程是无法直接操作UI的,否则会报错,会出现线程冲突之类的错误。
https://blog.csdn.net/wangzhezhilu001/article/details/100715796
C++引用?
析构函数可以声明为虚函数吗?目的为了什么?
析构函数忘记声明为虚函数,会引起什么问题?(面试官回答了)
QSS有没有接触过?(但是后面想到了,说了用过,但是比较少)
QT下的model view了解吗?
9.网络相关知识了解吗?(引到了项目上面)
TCP/UDP?(讲解TCP的项目,碰到的问题,解决方式,成果)
你自己偏向于哪个方向?
平时看哪些书籍(APUE必推哈哈哈,把书籍摆在书桌上,挨个念,但是怕真的问我书籍里面的相关知识!!)
13.反问
作者:Tavi
链接:https://www.nowcoder.com/discuss/353157035422326784
来源:牛客网