c++工程师面试题目_第1页
c++工程师面试题目_第2页
c++工程师面试题目_第3页
c++工程师面试题目_第4页
c++工程师面试题目_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++工程师面试题

在面试时,会有一些面试官通常都会问到的问题。针对这些常见

面试问题,我们提前准备好自己的答案,是十分有必要的。下面给大

家带来C++工程师面试题目2022,希望能帮助到大家!

C++工程师面试问题

1、C++是面向对象的编程语言吗?C++中虚函数(virtual)是

什么?有什么好处?

(1)C++不是纯面向对象的语言,C++是面向对象和过程的,

因为C++支持类和过程。

(2)虚函数(virtual)具有传递性,即子类中对父类的虚函数的重

写,也是一个虚函数,不过函数的参数表也要一样。

(3)可以让成员函数操作一般化,用基类的指针指向不同的派

生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对

象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该

成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,

调用时都会调用基类中定义的那个函数。

2、谈谈指针和引用的区别?

指针用操作符和,引用使用操作符.

相同点是:指针与引用都是让你间接引用其他对象。

区别:Q).指针是一个实体,指向一块内存,它的内容是所指

内存的地址;而引用仅是个别名,是某块内存的别名。

第1页共19页

(2).引用使用时无需解引用(_),指针需要解引用;

(3).引用只能在定义时被初始化一次,之后不可变,"从一而

终"指针可变;

(4).引用没有const类型,指针有const类型,const的指

针不可变;

(5).引用不能为空,指针可以为空

⑹."sizeof引用"得到的是所指向的变量(对象)的大小,而

"sizeof指针"得到的是指针本身(所指向的变量或对象的地址)的

大小;typeid(T)==typeid(T)恒为真,sizeof(T)==sizeof(T)恒为

真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的

规定)。

(7).指针和引用的自增(++)运算意义不一样;

3.intm=100,n=101;

intk=m;

k=n;〃此时K,m值分别是多少?

k和m的值都是101,因为k是对m的引用,k值发生变化,

m值也发生着变化。

4、c++中const修饰符一般用于那几种情况,具体作用是

什么?

(1).用常量定义constintn=100;

用于常量参数即fn(constinta)

用于常量函数,即类的该函数不修改其状态。

第2页共19页

用于返回值

(2).可以定义const常量,具有不可变性;便于进行类型检查,

使编译器对处理内容有更多了解,消除了一些隐患;可以保护被修饰

的东西,防止意外的修改,增强程序的健壮性;为函数重载提供了一

个参考;可以节省空间,避免不必要的内存分配提高了效率。编译

器通常不为普通const常量分配存储空间,而是将它们保存在符号表

中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,

使得它的效率也很高。

5、你在程序代码中用assert吗?assert一般用于做什么?

(1)是我常用。

(2)主要用于DEBUG下断言,即假设一定是这样的,否则就

是错误的。例如asser(a>100);

6、i++相比++i哪个更高效?为什么?

答:(l)++i比i++效率高。

(2)i++要多调用一次类的构造和析够函数

7、windows平台下网络编程有哪几种网络编程模型?你最熟

悉的是哪种?并对他们作个比较?

(1)有阻塞,,基于窗体的事件模型,事件模型,重叠模型,完

成端口模型。

(2)我最熟悉的是事件模型。

(3)除了阻塞模型外,其他都是非阻塞模型,其中效率最高的

是完成端口模型,尤其在windows下服务器最合适了。

第3页共19页

做客户端一般用事件模型了-在window和likeunix都可以

使用。

8、tcp进行传输时,接收方怎么告诉发送方"我已经处理不

过来了,先不要再发数据给我。"

答:接受方给发送方发一个通知数据包,该通知包让发送方暂

停数据的发送,或方慢发送。等接受方处理完毕后,再发一个恢复的

通知数据包。

9、设计udp网络协议包设计包多大合适,为什么?

答:最好设计成MTU的大小,MTU是Maximum

TransmissionUnit的缩写。意思是网络上传送的最大数据包。这样

的话传输速度会快。

10、win2000/win2003个有几个版本,每个版本最新系统补

丁包是什么?

11、DNS的实现方法?

12、WEB服务器的负载均衡?

13、请问目前市面上常用几种网络操作系统的优缺点?

14、请问你用过那些服务器?请讲述raid。、1、5的特点和优

占2

15、请列出下列协议的段口号:HTTP、HTTPS、DNS、FTP、

TELNET.PPTP、SMTP、POP3?

16、请问局域网内想要通过UNC路径或者NETBIOS名称访

问对方计算机,需要在对方计算机上开放什么协议或者端口?

第4页共19页

17、OSI七层模型?TCP/IP模型?

18、能否将WIN2000P升级成WIN2000S?

经典C++面试题

1.C++的类和C里面的struct有什么区别?

struct成员默认访问权限为public,而class成员默认访问权

限为private

2.析构函数和虚函数的用法和作用

析构函数是在对象生存期结束时自动调用的函数,用来释放在

构造函数分配的内存。

虚函数是指被关键字virtual说明的函数,作用是使用C++语

言的多态特性

3.全局变量和局部变量有什么区别?是怎么实现的?操作系统

和编译器是怎么知道的?

1)全局变量的作用用这个程序块,而局部变量作用于当前函数

2)前者在内存中分配在全局数据区,后者分配在栈区

3)生命周期不同:全局变量随主程序创建和创建,随主程序

销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,

退出就不存在

4)使用方式不同:通过声明后全局变量程序的各个部分都可

以用到,局部变量只能在局部使用

4.有N个大小不等的自然数Q-N),请将它们由小到大排序.

要求程序算法:时间复杂度为0(n),空间复杂度为0(1)。

第5页共19页

voidsort(inte[],intn)

inti;

intt;

for(i=l;i{

t=e[e[i]];

e[e[i]]=e[i];

e[i]=t;

)

)

5.堆与栈的去区别

A.申请方式不同

Stack由系统自动分配,而heap需要程序员自己申请,并指

明大小。

B.申请后系统的响应不同

Stack:只要栈的剩余空间大于申请空间,系统就为程序提供

内存,否则将抛出栈溢出异常

Heap:当系统收到程序申请时,先遍历操作系统中记录空闲

内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结

点从空间结点链表中删除,并将该结点的空间分配给程序。另外,

大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,

以便于delete语句正确释放空间。而且,由于找到的堆结点的大小

第6页共19页

不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空

闲链表。

C.申请大小限制的不同

Stack:在windows下,栈的大小是2M(也可能是1M它是

一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,

将提示overflow。因此,能从栈获得的空间较小。

Heap:堆是向高地址扩展的数据结构,是不连续的内存区域。

这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,

而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统

中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

D.申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内

存碎片,不过用起来最方便。

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配

内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快

内存,虽然用起来最不方便。但是速度快,也最灵活。

E.堆和栈中的存储内容

栈:在函数调用时,第一个进栈的是主函数中后的下一条指令

(函数调用语句的下一条可执行语句犯勺地址,然后是函数的各个参数,

在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的

局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部

第7页共19页

变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也

就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体

内容有程序员安排。

6.含参数的宏与函数的优缺点

宏:优点:在预处理阶段完成,不占用编译时间,同时,省

去了函数调用的开销,运行效率高

缺点:不进行类型检查,多次宏替换会导致代码体积变大,而

且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致

得出错误的结果。

函数:优点:没有带参数宏可能导致的副作用,进行类型检

查,计算的正确性更有保证。

缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效

率没有带参数宏高

PS:宏与内联函数的区别

内联函数和宏都是在程序出现的地方展开,内联函数不是通过

函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完

成的);宏同样是;

不同的是:内联函数可以在编译期间完成诸如类型检测,语句

是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和

内联函数也是不同的(在运行期间展开)

7.Windows程序的入口是哪里?写出Windows消息机制的

第8页共19页

流程

Windows程序的入口是WinMain。函数。

Windows应用程序消息处理机制:

A.操作系统接收应用程序的窗口消息,将消息投递到该应用

程序的消息队列中

B.应用程序在消息循环中调用GetMessage函数从消息队列

中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些

预处理。

C.应用程序调用DispatchMessage,将消息回传给操作系统。

D.系统利用WNDCLASS结构体的IpfnWndProc成员保存

的窗口过程函数的指针调用窗口过程,对消息进行处理。

8.如何定义和实现一个类的成员函数为回调函数

A.什么是回调函数?

简而言之,回调函数就是被调用者回头调用调用者的函数。

使用回调函数实际上就是在调用某个函数(通常是API函数)时,

将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那

个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用

回调函数。

回调函数,就是由你自己写的,你需要调用另外一个函数,而

这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在

必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里

完成你要做的事。

第9页共19页

B.如何定义和实现一个类的成员函数为回调函数

要定义和实现一个类的成员函数为回调函数需要做三件事:

a声明;

b.定义;

c.设置触发条件,就是在你的函数中把你的回调函数名作为一

个参数,以便系统调用

如:

一、声明回调函数类型

typedefvoidCFunPtr)(void);

二、定义回调函数

classA

(

public:

A();

staticvoidcallBackFun(void)〃回调函数必须声明为static

(

coutcallBackFun

)

virtual~A();

};

三、设置触发条件

voidFuntype(FunPtrp)

第10页共19页

pO;

)

voidmain(void)

Funtype(A::callBackFun);

)

C.回调函数与API函数

回调和API非常接近,他们的共性都是跨层调用的函数。但区

别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;

而回调正好相反,他是高层提供给底层的调用,对于低层他是未知

的,必须由高层进行安装,这个安装函数其实就是一个低层提供的

API,安装后低层不知道这个回调的名字,但它通过一个函数指针来

保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的

参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存

这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个

函数。

1、局部变量能否和全局变量重名?

能/局部会屏敝全局。要用全局变量,需要使用::

局部变量可以与全局变量同名,在函数内引用这个变量时,会

用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,

第11页共19页

在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内

都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环

体内。

2、如何引用一个已经定义过的全局变量?

extern

可以用引用头文件的方式,也可以用extern关键字,如果用

引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那

个变写错了,那么在编译期间会报错,如果你用extern方式引用时,

假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报

错。

3、全局变量可不可以定义在可被多个.C文件包含的头文件中?

为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只

能有一个C文件中对此变量赋初值,此时连接不会出错。

4、语句for(;1。有什么问题?它是什么意思?

无限循环,和while(l)相同。

5、dowhile和whiledo有什么区别?

前一个循环一遍再判断,后一个判断以后再循环。

6、请写出下列代码的输出内容

#include

main()

第12页共19页

inta,b,c,d;

a=10;

b=a++;

c=++a;

d=10_a++;

printf("b,c,d:%d,%d,%d",b,c,d);

return0;

)

答:10,12,120

7、请找出下面代码中的所以错误

说明:以下代码是把一个字符串倒序,如"abed"倒序后变

为"deba"

#include"string.h"

main()

(

char_src=/,hello,world";

char_dest=NULL;

intlen=strlen(src);

dest=(char_)malloc(len);

char_d=dest;

char_s=src[len];

第13页共19页

while(len-!=O)

d++=s-;

printf("%s",dest);

return0;

}

答:

方法1:

intmain()

(

char_src="hello,world";

intlen=strlen(src);

char_dest=(char_)malloc(len+l);〃要为\0分配一个空间

char_d=dest;

char_s=src[len-l];〃指向最后一个字符

while(len-!=0)

_d++=_s-;

,d=0;〃尾部要加\0

printf(H%s\nM,dest);

free(dest);〃使用完,应当释放空间,以免造成内存汇泄露

return0;

}

方法2:

第14页共19页

#include

#include

main()

(

charstr[]=z,hello,world";

intlen=strlen(str);

chart;

for(inti=0;i{

t=str[i];

str[i]=str[len-i-l];str[len-i-l]=t;

)

printf(%s,str);

return0;

)

C++面试题目

.介绍一下详细说明如何实现

1STL,STLvectoro

STL(标准模版库standardTemplateLibrary)它由容器算法

迭代器组成。

STL有以下的一些优点:

可以方便容易地实现搜索数据或对数据排序等一系列的算法;

调试程序时更加安全和方便;

即使是人们用STL在UNIX平台下写的代码你也可以很容易地

第15页共19页

理解(因为STL是跨平台的)。

vector实质上就是一个动态数组,会根据数据的增加,动态的

增加数组空间。

2.如果用VC开发程序,常见这么几个错误,

C2001,c2005,c2011,这些错误的原因是什么。

在学习VC++的过程中,遇到的LNK2001错误的错误消息主

要为:

unresolvedexternalsymbol"symbol"(不确定的夕卜部

"符号")。

如果连接程序不能在所有的库和目标文件内找到所引用的函

数、变量或标签,将产生此错误消息。

一般来说,发生错误的原因有两个:一是所引用的函数、变量

不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接

库。

编程中经常能遇到LNK2005错误——重复定义错误,其实

LNK2005错误并不是一个很难解决的错误.

3.继承和委派有什么分别,在决定使用继承或者委派的时候需

要考虑什么。

在OODQOP中,组合优于继承.

当然多态的基础是继承,没有继承多态无从谈起。

当对象的类型不影响类中函数的行为时,就要使用模板来生成

这样一组类。

第16页共19页

当对象的类型影响类中函数的行为时,就要使用继承来得到这

样一组类.

4.指针和引用有什么分别;如果传引用比传指针安全,为什么?

如果我使用常量指针难道不行吗?

(1)引用在创建的同时必须初始化,即引用到一个有效的对象;

而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋

值.

(2)不存在NULL引用,引用必须与合法的存储单元关联;而指

针则可以是NULL.

(3)引用一旦被初始化为指向一个对象,它就不能被改变为另

一个对象的引用;而指针在任何时候都可以改变为指向另一个对象.给

引用赋值并不是改变它和原始对象的绑定关系.

(4)引用的创建和销毁并不会调用类的拷贝构造函数

(5)语言层面,引用的用法和对象一样;在二进制层面,引用一

般都是通过指针来实现的,只不过编译器帮我们完成了转换.

不存在空引用,并且引用一旦被初始化为指向一个对象,它就

不能被改变为另一个对象的引用,显得很安全。

const指针仍然存在空指针,并且有可能产生野指针.

总的来说:引用既具有指针的效率,又具有变量使用的方便性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论