腾讯研发类笔试面试试题及答案(C++方向)

本文详细解析了腾讯研发笔试面试中涉及的C++相关题目,包括C和C++的区别、C++的多态性、虚函数实现、内存分配问题,以及协程概念。同时,涵盖了CGI、进程间通信、线程间通信、TCP的三次握手与四次挥手流程,以及HTTP与HTTPS的区别。此外,还讨论了虚拟内存、单链表反转算法、红黑树及其查找复杂度,以及数据库引擎和索引的基本概念。
摘要由CSDN通过智能技术生成

题很多,先上题后上答案,便于大家思考

 

 

 

问题点:

1、C和C++的特点与区别?

2、C++的多态

3、虚函数实现

4、C和C++内存分配问题

5、协程

6、CGI的了解

7、进程间通信方式和线程间通信方式

8、TCP握手与释放

9、http和https的区别?

10、虚拟内存的概念与介绍

11、单链表的反转算法

12、红黑树以及其查找复杂度

13、KPM字符串匹配

14、TCP超时等待、重传以及流量控制

15、数据库引擎

16、数据库索引

 

1、C和C++的特点与区别?

答:(1)C语言特点:

1.作为一种面向过程的结构化语言,易于调试和维护;

2.表现能力和处理能力极强,可以直接访问内存的物理地址;

3.C语言实现了对硬件的编程操作,也适合于应用软件的开发;

4.C语言还具有效率高,可移植性强等特点。

(2)C++语言特点:

1.在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;

2.可以使用抽象数据类型进行基于对象的编程;

3.可以使用多继承、多态进行面向对象的编程;

4.可以担负起以模版为特征的泛型化编程。

C++与C语言的本质差别:在于C++是面向对象的,而C语言是面向过程的。或者说C++是在C语言的基础上增加了面向对象程序设

计的新内容,是对C语言的一次更重要的改革,使得C++成为软件开发的重要工具。

 

2、C++的多态

答:C++的多态性用一句话概括:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来

调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

1):用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数;

2):存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是

和对象对应的;

3):多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。;

4):多态用虚函数来实现,结合动态绑定.;

5):纯虚函数是虚函数再加上 = 0;

6):抽象类是指包括至少一个纯虚函数的类;

纯虚函数:virtual void fun()=0;即抽象类,必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。

 

3、虚函数实现

答:简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类

所有的虚函数对应的函数指针。例:

其中:

B的虚函数表中存放着B::foo和B::bar两个函数指针。

D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。

虚函数表构造过程:

从编译器的角度来说,B的虚函数表很好构造,D的虚函数表构造过程相对复杂。下面给出了构造D的虚函数表的一种方式(仅供参考):

虚函数调用过程

以下面的程序为例:

 

4、C和C++内存分配问题

答:(1)C语言编程中的内存基本构成

C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。

1.栈 ——由编译器自动分配释放;

2.堆 ——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;

3.全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量

和未初始化的静态变量在相邻的另一块区域(C++中已经不再这样划分),程序结束释放;

4.另外还有一个专门放常量的地方,程序结束释放;

(a)函数体中定义的变量通常是在栈上;

(b)用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上;

(c)在所有函数体外定义的是全局量;

(d)加了static修饰符后不管在哪里都存放在全局区(静态区);

(e)在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用;

(f)在函数体内定义的static表示只在该函数体内有效;

(g)另外,函数中的"adgfdf"这样的字符串存放在常量区。

(2)C++编程中的内存基本构造

在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;

1、栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量、函数参数等。

2、堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如

果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3、全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在

C++里面没有这个区分了,他们共同占用同一块内存区。

4、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。

5、代码区 (.text段),存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。

内存模型组成部分:自由存储区,动态区、静态区;

根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。

自由存储区:局部非静态变量的存储区域,即平常所说的栈;

动态区: 用new ,malloc分配的内存,即平常所说的堆;

静态区:全局变量,静态变量,字符串常量存在的位置;

注:代码虽然占内存,但不属于c/c++内存模型的一部分;

一个正在运行着的C编译程序占用的内存分为5个部分:代码区、初始化数据区、未初始化数据区、堆区 和栈区;

(1)代码区(text segment):代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值