网易互娱游戏研发面经及答案:C++基础

面经整理自网络,答案为个人补充内容。

C++基础

1. 多态,虚函数

我的C++学习笔记

  1. 怎么理解多态?多态的定义?
    答:多态就是让程序可以在编译时/运行时决定被调用的方法是哪一个。多态分编译时多态和运行时多态。运行时多态通过继承和虚函数来体现;在程序编译时多态体现在函数和运算符的重载上。
  2. 举个多态的例子?
    比如有个英雄类,它有个攻击方法。现在再实现它的两个子类法师类和战士类,它们各自有不同的攻击方法。然后在程序执行时就可以用英雄类的指针指向法师类或者战士类对象,然后用这个父类指针调用战斗时就会触发动态绑定,调用到指向对象自己的方法。
  3. C++如何实现多态?
    答:将基类类型的指针或者引用指向派生类型的对象。通过虚函数,子类重写父类函数,执行时根据对象类型执行不同的函数达到多态。
  4. 多态有什么用?
    答:①代码重用:隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;②接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用
    C++虚函数的实现机制?
  5. 虚函数具体是怎么实现动态绑定的?
    答:类有一个虚函数表,定义的每个实例对象有一个虚函数表指针指向类的虚函数表。子类重写父类的虚函数会替换虚函数表项的对应函数指针。
  6. 每个实例对象都有一个虚函数表指针吗?
    答:是的。
  7. 虚函数放哪?
    答:放在类的最前面的位置,有一个指向虚函数表的指针
  8. 多继承的虚函数表怎么放?
    答:一个在上另一个在下面,按照继承顺序
  9. 说说虚继承?
    答: 如果b,c是a的子类,d继承b,c,那么d中a会被构造两次,造成数据冗余。使用虚继承则a只会被构造一次
    虚函数,子类父类virtual 写不写有什么区别
    4.虚函数的原理介绍一下,哪些函数不能是虚函数构造函数中可以调用虚函数吗?为什么?
    析构函数需要声明为虚函数吗?为什么?
    5.虚函数指针在多继承下的情况
    比如类C继承了类A和类B。A,B中都有虚函数,那么C的虚表指针有多少个,
    6.类C又定义了自己的虚函数,在虚表中的存储位置?
    //问题5和6推荐看一下这篇博客 说的很详细 https://blog.csdn.net/li1914309758/article/details/79916414
    虚函数的原理?
    A是基类,B是子类,B在构造函数中调用A的虚函数会怎样?
    1.C++虚函数(1) 函数调用(2) 虚函数表什么时候创建,工作原理(
    ①C++的多态如何实现(虚函数、虚函数表那些),是如何从调用虚函数到虚函数表里的指针指向指定虚函数,

1.多态的实现
2.如果父类和子类定义了一个函数名相同的函数,但不是虚函数,问父类指针指向的子类对象,调用这个函数是调用父类还是子类函数?同样,如果子类指针指向父类的对象,调用这个函数是调用父类还是子类函数?讲述一下它的原理

虚函数调用是怎么实现的。动态绑定发生时是怎么调用到子类的函数。多继承的子类有几个虚函数表。

2. 关键字

static关键字
介绍一下extern
2.Static关键字各种用法,作用,Static声明的函数能否在其他文件中调用
3.Const关键字各种用法
类型转换,指针强制转换有什么危害,多继承子类父类指针转换(列出一种转换是否可以为什么或者为什么不行会有什么问题)
③const定义常量和define有什么区别?const定义的变量是执行时定义,define是预编译的时候直接替换。
6. const关键字的作用以及和defined的区别
7. C++有几种类型转换?
答:静态动态const和重编译四种,这个定义到处都是,这里就不写了。
可以在头文件定义static变量吗?为什么?
虚函数可以定义为static变量吗?
static
他又问static关键字是什么用。我说类里面就是静态成员函数,无论有几个类实例都只会有这一份拷贝。他说除了这个还有别的用处吗?我又说在方法里同样也是方法无论调用几次都只有这一份拷贝,而且只能在方法内被访问。他问还有吗?我想想说大概还能作为全局静态吧……记不太清了。

3.指针

①引用与指针的区别?引用是别名,底层实现还是指针。使用的什么有什么区别?指针需要通过地址符取变量的地址,引用直接通过引用变量。
②const修饰指针有哪几种?区别?常量指针和指向常量的指针两种。指向常量的指针是指不能修改指针还是不能修改指针指向的变量?不能修改指针指向的变量。

⑦C++11一些新的特性有了解,比如智能指针?有三类,share、uni、和weak,weak是配合share使用的,它是通过一个和对象相关的计数器进行计数,当指向对象的指针的数目为0的时候,自动销毁对象,比new和delete人性化很多。
1.C++11的特性 ,然后介绍一下有哪几个智能指针,然后weak_ptr是怎么工作的。
7.C++11的新特性了解哪些,new的新特性
8.右值引用和move()方法说一下
9.所有的智能指针说一下,全局变量和静态变量可以用智能指针吗
10.shared_ptr实现一下
11.weak_ptr如何解决shared_ptr的循环引用问题,具体举一个例子说一下
//可以直接敲代码实现例子
智能指针有哪些?为什么要用?内存泄露情况怎么解决?
指针和引用区别,作参数区别
③介绍智能指针
指针和引用的区别
虚函数表的存放位置;
基类析构函数需要为什么需要设置成虚函数,写代码演示一下;

4.类与函数

编译器给类缺省的成员函数有哪些?
在构造函数、析构函数中调用虚函数为什么有时可以有时不行?为什么会造成内存问题?
类管理内存的方式?除了构造函数和析构函数外还有吗?
怎样理解可重入函数?和不可重入有什么区别?机制是什么?为什么多线程要用可重入,怎样保证的线程安全?
然后问了下C++的虚函数能不能inline,以及宏和inline函数的区别
inline有什么用
④重载有了解吗?不同个数参数或者个数相同但参数类型顺序不同的同名函数。如果参数相同但返回变量类型不同可以吗?不可以。

空类的大小是否为0,空类里面有什么?
触发拷贝构造函数的情况;

4.数据结构

12.stl平时用过哪些,大致把每一部分介绍一下
13.map和unordered_map用过吗,底层如何实现的,它们的区别有哪些
14.红黑树和哈希表有什么关系,介绍一下红黑树的特性,插入,删除
15.哈希表处理冲突的几种方法说一下
16.使用再哈希法处理过冲突的哈希表,平均查找的时间复杂度是多少
17.再哈希法如何优化
.列表和数组的区别 vector底层实现是什么?数据存放太多会怎么样?push_back底层实现是怎么做的?
(5)BST,AVL,红黑树
(6)vector的扩容,时间复杂度,扩容大小选择
(7)实现双端队列,O(1)时间复杂度下标读取
STL用得多吗?vector扩容,map用的什么实现?
哈希表清楚吗?解决冲突的方式?线性探查法如果新插入的冲突元素前面的元素被删除,怎么寻找?线性探查法和拉链法的区别?除了时间上还有别的吗?(注意不是链表和数组的区别?)
4.哈希冲突怎么解决 开放寻址法中删除元素该如何操作? 拉链法中链表太长了应该如何解决
map的底层逻辑是怎么实现的?vector的内存变化是怎样的?vector类型新增元素这个操作的时间复杂度如何?
有什么容器,map和set的插入复杂度是多少
常用的容器操作
二叉堆是什么?
介绍几种哈希算法

⑥C++中STL有用过吗?vector用过哪些功能?vector是变长数组它是怎么实现的?定义一个初始长度的数组,好像是(12),如果待存储容量超过数组长度,新开一个2倍容量的数组,把数组内容拷贝过去。
map有用过吗,它是一个key-value对,怎么实现的?红黑树。那红黑树能讲讲吗?这个不太会,它是一颗二叉查找树,增加了一些约束规则,根节点和叶节点都是黑色的,中间没层是红黑相间,通过这些规则约束,它也是平衡的。那它与普通的平衡二叉树有什么不同,为什么用红黑树而不用平衡二叉树?这个不会。

4、vector扩容机制,一个vector初始容量为1。扩到N的时间复杂度,估算往一个 vector 插入N个元素的时间复杂度。
5、vector要想释放一段内存用什么,resize会不会释放内存

map了解吗介绍一下,内部实现是什么,作为map的key有没有要求?有什么要求?除了重写类比较操作符以外还有别的排序方法吗。

map和unorder_map的底层数据结构
vector迭代器失效的情况

实现vector的可变数组功能

给你一个容器,怎样去实现它的底层内存管理?
STL容器
然后就是问C++的容器,STL的容器我有没有用过。当然实际上我没怎么用过,但是我全都看过,所以就说了几个vector、list、deque之类的。他就问vector和list有什么区别。向量和链表区别大了去了,一个是连续内存一个是链表。一个动态空间靠重分配一个本身就是离散的理论上没有空间限制。一个可以随机访问一个不行……等等等等,不详细列了。

他又问map用过吗,我说也用过。他map底层是怎么实现的?我说就是红黑树嘛。每个值是key-value对,然后他们按key值存在红黑树里。他就问红黑树定义,我凭印象大概给他说了一遍。说的时候我说红黑树不同于平衡二叉树,他就问那为什么有平衡二叉树了还要红黑树?红黑树有哪里好吗?我这里就卡住了,毕竟我没有思考过这个问题,我就凭想象说红黑维护代价应该比平衡二叉树简单一点吧。毕竟红黑再重新调整时只涉及单边子树,平衡涉及整棵树。这个因为是我临时诌出来的答案,我说的时候也没那么自信,他也反复追问“是指写程序的时候方便一些?”“你是说平衡效率更高?”最后我才整理出单边子树的说法。事后网上查了查,好像确实大概是这么回事,lucky。

红黑树结束后他又问了大小顶堆,问这是怎么实现的。我说说是堆实际上是个数组。第i个数的左子节点是2i+1,右是2i+2,每次插入新元素就从最后一个分支节点也就是n/2开始检查它和子节点的大小关系。这是我面试前专门看过的。他听了挺满意,然后问了个用大小顶堆做的问题。给定一个数组,求前n大的数。(这问题我研究生面试也被问过,当时我还不知道大顶堆……)我就很顺口,那就维护一个长度为10的大顶堆嘛。他说你确定是大顶堆?我还觉得奇怪,找最大不是大顶堆?然后他就要我详细讲,我说着说着才反应过来,哦应该是小顶堆……我改过来后他又详细问了一遍,我就详细说了实现过程。改了过来应该也算是可以……吧?

Stdcall void func()有什么作用?

windows下的WINAPI void func()?原理是什么?

内存

6、new和malloc 的区别,要想new不抛出异常怎么办。
new和malloc的区别
c 11 的new 有什么新特性

(2)new和delete过程,顺序
7、new[]不配合delete[]使用会发生什么情况,为什么。
Malloc的底层原理?为什么不直接用brk()调用?怎样去分配内存?
C++二维数组在内存中如何存放? 不同的读取数组方式会有什么影响?
堆和栈的区别

Select,poll,epoll的区别?Epoll和poll都有哪些具体的区别?除了这些区别它们一样吗?有Epoll了还要其他两个函数干什么?

(8)进程和线程,单核CPU能跑多线程吗
(9)线程共享的内容,进程间的相互隔离怎么理解?

(4)字符串逆置,传char*
(5)100w的数据,name,26个字符,要找匹配BC的那些项。ABCD可行,BCDA可行,FBDC不可行。这里我说前缀树,然后问题在于不是B打头怎么办,面试官提示是否可以对前缀树的结构进行改进?不进行遍历来判断?没想出来

数据库

9.数据库的索引是用什么实现的
10.B树和B+树有什么区别,为什么不用红黑树或者普通二叉树来实现索引//重点:减少IO次数
现场笔试:手撕代码实现size_t strlcpy(char* dst, const char* src,size_t size)

4.寻路问题。飞机想由出口到终点。让我设计系统。(即设计图怎么表示)
答:面试官说从简单的来。我就说用二维矩阵表示,障碍为1,其他为0。
5.(也就是二维矩阵每个数字表示多大体积)障碍体积应该多大?物体有体积应该怎么考虑?
答:跟飞机的最小行进单位有关。
6.寻路算法
答:BFS
7.如果图很大,怎么优化?
答:答了A*,动态规划以及图最短路径等算法。

  1. 排名实时更新,你排在几万名的位置,怎么快速查到自己的排名-(这个感觉回答的不太好。。。回答了一个二分查找的思路,但有一些坑要注意)

  2. 了解epoll吗,为什么epoll会比较快,epoll的原理

  3. linux文件最大有多大-(回答的不太符合面试官想要的答案,又提示了虚拟内存)>虚拟内存原理
    16.单链表原地排序

1.老问题,快速找到自己在排行榜的排名
17. 游戏中人物有视野,怎样实现把视野中的人显示出来视野外的不显示(不太记得了)

左值引用和右值引用(给几个表达式让判断);
给一个结构体算它的sizeof,用什么可以改变对齐;

写代码:定义边界相连的三角形集合称为“岛“,给一组三角形的点坐标如:(0, 1, 2), (0, 2, 3), (4, 5, 6);问有几个“岛”,例子是2个岛(25分钟);
有什么要问的?

2道代码题
1.爬楼梯问题
2.环形缓冲区push pop popall操作
基础
写完代码题后又要求实现一个循环链表 问循环列表与单向链表之间的优缺点
手写个template模板函数
怎么实现线程安全
线程同步的方式

怎么实现单例模式?
实现一个函数,输入整型参数size和k,返回大小为size字节的内存且满足k字节对齐

2、100W个起始结束IP段以及对应中文名,建一个系统,让它可以很快查找出某个IP对应的中文名。。(隐约看到别人有发过类似题目?我没准备过,在面试官提示下答得还是很差。。)

介绍一下DAG
手撕一个拓扑排序
设计一种数据结构,有关聊天界面的,要满足:
1、数据结构内按照上一次聊天进行排序
2、支持一个节点变成头部
3、在头部插入新节点
4、尾部删除节点
答带尾指针的链表,问查询有没有优化,我觉得没有

介绍一下单例设计模式,怎么实现
一个父类A里有一个虚函数f(),被A类里另外一个普通函数g()调用,g()被构造函数调用,类B继承类A,重写f()
现在A *a = new B,问调用,的是哪个f(),详细说一下编译器在这里是怎么做的

日志记录ip地址,如何统计ip地址访问次数

③栈和堆区别?

⑤介绍DFS和DFS

①字符串压缩(a-z,A-Z),把一个字符串用比字符串本身更小的空间存储。我想到的是用52进制的哈希函数,映射为一个整数。面试官让我举一个具体实例分析一下,然后明白之后说你这个压缩后有可能比原始字符串更长。面试完和同学讲这个,同学说用霍夫曼编码,当时压根就没想起来。
②二维网格,有些网格有障碍物不能通过,给定起点和终点,找一条路径但没要求最短。BFS或者DFS,如果找最短,把所有路径存下来找一条最短的。面试官说如果网格非常大,执行就很慢,有没有什么优化?没想出来,然后面试官提示分治。怎么分治呢?找一个中间点,如果能够和起点和终点联通,继续找中间点。面试官说这个找中间点好像不太好找,不一定和起点和终点通。然后我又说用双指针的方法,起点和终点同时往外搜索,直到相遇。这个题也答得不好。

  1. 给你两个字符串,比如abc和aeabbqqqcc,问第二个串中包含多少个第一个串,可以不连续,并且任意两个串不能有公共部分,例子答案是2个
    这个题和PAT上的一个题差不多,O(n)扫一遍就出答案了
  2. 给你一个无序数组,找两个元素ai和aj,使得ai-aj最大,并且i>j
    直接贪心就行了吧,但是面试官要求用dp搞。。把序列a当成一个前缀和,还原出原始序列,求最大连续子段和
  3. 给你一个数组,每个数组有一个正数ai,表示从i位置可以一步往后走到i+ai,当然也可以一步从i走到i+1,问从1走到n最少几步
    比较简单的dp吧,或者直接BFS一下

图的最小生成树

实现一个数据结构,能取到队列的最大值

内存里加载了10个资源,有10个新资源等待加载,怎么调度;

你可能感兴趣的:(面试,C++)