C++常见笔试题及答案.docx
- 文档编号:12518349
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:53
- 大小:41.02KB
C++常见笔试题及答案.docx
《C++常见笔试题及答案.docx》由会员分享,可在线阅读,更多相关《C++常见笔试题及答案.docx(53页珍藏版)》请在冰豆网上搜索。
C++常见笔试题及答案
C++面试题
1#include“”和#include<>的区别
答:
对于#include<>编译器从标准库开始搜索
对于#include“”编译器从用户工作路径开始搜索
2头文件的作用是什么
答:
一、通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
二、头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则,能大大减轻程序员调试、改错的负担。
3C++函数中值的传递方式有哪几种
答:
C++函数的三种传递方式为:
值传递、指针传递和引用传递。
4内存的分配方式有几种
答:
一、从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量。
二、在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:
双向链表删除一个节点P
template
:
delnode(intp)
{
intk=1;
listnode
ptr=first;
while(ptr->next!
=NULL&&k!
=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"你已经将数据项"< ptr->next=ptr->next->next; length--; deletet; } 在节点P后插入一个节点: template : insert(typet,intp) { listnode ptr=first; intk=1; while(ptr! =NULL&&k { ptr=ptr->next; k++; } if(ptr==NULL&&k! =p) returnfalse; else { listnode tp=newlistnode tp->data=t; tp->next=ptr->next; ptr->next=tp; length++; returntrue; } } 6写一个函数,将其中的\t都转换成4个空格。 boolchange(char*buf,intlen) { intcount=0; inti; 函数WinMain() Windows应用程序的消息处理机制如图所示。 (1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。 (2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。 取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。 (3)应用程序调用DispatchMessage,将消息回传给操作系统。 消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。 因此,DispatchMessage函数总能进行正确的传递。 (4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。 8如何定义和实现一个类的成员函数为回调函数 把函数声明为static 9C++里面是不是所有的动作都是main()引起的如果不是,请举例. 答: 在运行c++程序时,通常从main()函数开始执行。 因此如果没有main(),程序将不完整,编译器将指出未定义main()函数。 例外情况: 如,在windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码。 由于DLL模块不是独立的程序,因此不需要main().用于专用环境的程序--如机器人中的控制器芯片--可能不需要main().但常规的独立程序都需要main(). 10C++里面如何声明constvoidf(void)函数为C程序中的库函数 extern"C"voidf(void); 11下列哪两个是等同的C==D intb; Aconstint*a=&b; Bconst*inta=&b; Cconstint*consta=&b; Dintconst*consta=&b; 12内联函数在编译时是否做参数类型检查 是 13三个float: a,b,c问值 (a+b)+c==(b+a)+c1 (a+b)+c==(a+c)+b1 14把一个链表反向填空 voidreverse(test*head) {test*pe=head; test*ps=head->next; while(ps) {pe->next=ps->next; ps->next=head; head=ps; ps=pe->next;}} 16某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)中运行,还需要优化吗 要。 程序在每时每刻都要优化,只要能找到可以优化的方法。 优化有多种目的,在200M的CPU中可能需要以速度为重点优化,在300M的CPU中可能要以代码长度为目的优化。 17.下面哪种排序法对12354最快C aquicksort哪种结构,平均来讲,获取一个值最快B a.binarytreehashtablestack 20请讲一讲析构函数和虚函数的用法和作用 答: 析构函数的名字和类名相同,没有返回值,没有参数,不能随意调用也没有重载。 只是在类对象生命期结束时由系统自动调用。 虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联编。 21全局变量和局部变量有什么区别是怎么实现的操作系统和编译器是怎么知道的 答: 一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。 全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区. 22一些寄存器的题目,主要是寻址和内存管理等一些知识。 1、立即寻址 2、寄存器寻址 3、直接寻址 4、寄存器间接寻址 5、基址加变址寻址 6、寄存器相对寻址 7、相对基址加变址寻址 238086是多少位的系统在数据总线上是怎么实现的 8086有16根数据线和20根地址线,因为可用20位地址.8086是16位处理器. 24多态。 overload和override的区别。 答: 多态: 接口的多种不同的实现方式即为多态 重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。 覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。 < 25.完成下列程序 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.....*.....*..... *......*......*......*......*......*......*...... *.......*.......*.......*.......*.......*.......*.......*....... #include usingnamespacestd; constintn=8; main() { inti; intj; intk; for(i=n;i>=1;i--) { for(j=0;j { cout<<"*"; for(k=1;k { cout<<"."; } } cout< } system("pause") } 26完成程序,实现对数组的降序排序 #include usingnamespacestd; voidsort(int*arr,intn); intmain() { intarray[]={45,56,76,234,1,34,23,2,3}; sort(array,9); for(inti=0;i<=8;i++)value&&! =NULL)) { while(N>=&&! =NULL) temp=; while(N<&&! =NULL) temp=; } if(N>= =NewNode; else =NewNode; return;}} 29.AclassBnetworkontheinternethasasubnetmaskofwhatisthemaximumnumberofhostspersubnet. a.240b.255c.4094d.65534 30.Whatisthedifference: betweeno(logn)ando(logn^2),wherebothlogarithemshavebase2. a.o(logn^2)isbiggerb.o(logn)isbigger c.nodifference 31.Foraclasswhatwouldhappenifwecallaclass’sconstructorfromwiththesameclass’sconstructor. a.compilationerrorb.linkingerror c.stackoverflowd.noneoftheabove 32.“new”inc++isa: . a.libraryfunctionlikemallocinc b.keywordc.operator d.noneoftheabove 33.Whichofthefollowinginformationisnotcontainedinaninode. a.fileownerb.filesize c.filenamed.diskaddress 34.What’sthenumberofcomparisonsintheworstcasetomergetwosortedlistscontainingnelementseach. a.2n+1 35.TimecomplexityofnalgorithmT(n),wherenistheinputsize,isT(n)=T(n-1)+1/nifn>1otherwise1theorderofthisalgorithmis. a.log(n)b.nc.n^2d.n^n 36.Thenumberof1’sinthebinaryrepresentationof3*4096+15*256+5*16+3are. a.8b.9c.10d.12 37.设计函数intatoi(char*s)。 38.inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);输出是多少 39.解释局部变量、全局变量和静态变量的含义。 40.解释堆和栈的区别。 栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 堆: 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 41.论述含参数的宏与函数的优缺点。 1.函数调用时,先求出实参表达式的值,然后带入形参。 而使用带参的宏只是进行简单的字符替换。 2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。 3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。 宏定义时,字符串可以是任何类型的数据。 4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 5.使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。 6.宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。 一般来说,用宏来代表简短的表达式比较合适。 42.以下三条输出语句分别输出什么[C易] charstr1[]="abc"; charstr2[]="abc"; constcharstr3[]="abc"; constcharstr4[]="abc"; constchar*str5="abc"; constchar*str6="abc"; cout< 答: BD a.classB: publicA{……}classB{operatorA();}classA{A(constB&);}A&operator=(constA&);以下代码中的两个sizeof用法有问题吗[C易] voidUpperCase(charstr[])以下代码有什么问题[C难] voidchar2Hex(charc)以下代码有什么问题[C++易] structTest { Test(int){} Test(){} voidfun(){} }; voidmain(void) { Testa (1); (); Testb(); (); } ***Testb();以下代码有什么问题[C++易] cout<<(true1: "1")< 8.以下代码能够编译通过吗,为什么[C++易] unsignedintconstsize1=2; charstr1[size1]; unsignedinttemp=0; cin>>temp; unsignedintconstsize2=temp; charstr2[size2]; 48.以下代码中的输出语句输出0吗,为什么[C++易] structCLS { intm_i; CLS(inti): m_i(i){} CLS() { CLS(0); } }; CLSobj; cout<<< 49.C++中的空类,默认产生哪些类成员函数[C++易] 答: classEmpty { public: Empty();以下两条输出语句分别输出什么[C++难] floata=; cout<<(int)a< cout<<(int&)a< cout< vectorarray; (1); (2); (3); for(vector: : size_typei=()-1;i>=0;--i)以下代码有什么问题[STL易] typedefvectorIntArray; IntArrayarray; (1); (2); (2); (3); 写一个函数,完成内存之间的拷贝。 [考虑问题是否全面] 答: void*mymemcpy(void*dest,constvoid*src,size_tcount) { char*pdest=static_cast constchar*psrc=static_cast if(pdest>psrc&&pdest { for(size_ti=count-1;i! =-1;--i) pdest[i]=psrc[i]; } else { for(size_ti=0;i pdest[i]=psrc[i]; } returndest; } intmain(void) { charstr[]="09"; mymemcpy(str+1,str+0,9); cout< system("Pause"); return0; } 54线程与进程的区别 进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。 55: 请你分别划划OSI(开放式系统互联)的七层网络结构图,和TCP/IP的五层结构图 56: 请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用TCP与UDP呢 IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输 57: 请问交换机和路由器分别的实现原理是什么分别在哪个层次上面实现的 交换机用在局域网中,交换机通过记录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地址。 路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。 路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地址 但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。 58: 请问C++的类和C里面的struct有什么区别 (1)C++类中属性默认访问类型为private,而C中的struct默认的访问类型为public (2) (2)c++类可以有继承,虚函数,多态,而C中struct不可以。 C++的class具有数据封装功能,其包含属性访问级别可以为private,public和protect,还具有实现类接口功能和辅助功能的操作函数,而struct属性访问权限只有public,没有数据封装功能,也就没有实现信息隐藏这一面向对象的思想的机制,struct本身不含有操作函数,只有数据。 59: 请讲一讲析构函数和虚函数的用法和作用 析构函数是在类对象死亡时由系统自动调用,其作用是用来释放对象的指针数据成员所指的动态空间,如果在构造函数中,你申请了动态空间,那么为了避免引起程序错误,你必须在析构函数中释放这部分内存空间。 如果基类的函数用virtual修饰,成为虚函数,则其派生类相应的重载函数仍能继承该虚函数的性质,虚函数进行动态联编,也即具有多态性,也就是派生类可以改变基类同名函数的行为,在面向对象世界中,多态是最强大的机制,虚函数就是这一机制的c++实现方式。 60: 全局变量和局部变量有什么区别实怎么实现的操作系统和编译器是怎么知道的 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。 全局变量分配在全局数据段并且在程序开始运行的时候被加载.局部变量则分配在堆栈里面。 61: 一些寄存器的题目,主要是寻址和内存管理等一些知识。 2、交换机用在局域网中,交换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地质。 路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。 路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地质 但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。 3、IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输。 4、 Testb();样用最快的方法判断链表是否有环 设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇, ++中引用和指针有什么不同指针加上什么限制等于引用 答: 1引用被创建的时候必须被初始化,而指针不是必需的。 2引用在创建后就不能改变引用的关系,而指针在初始化后可以随时指向其它的变量或对象。 3没有NULL引用,引用必须与合法的存储单元关联,而指针可以是NULL。 65.做的项目,遇到的困难,怎样解决 69.操作符重载 classCMyObject: pulicCObject { Public: CMyObject(); CMyObject&operator=(const
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 常见 笔试 答案