C++常见笔试题及答案.docx
- 文档编号:3572363
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:86
- 大小:73.44KB
C++常见笔试题及答案.docx
《C++常见笔试题及答案.docx》由会员分享,可在线阅读,更多相关《C++常见笔试题及答案.docx(86页珍藏版)》请在冰豆网上搜索。
C++常见笔试题及答案
C++面试题
1#include“filename.h”和#include 答: 对于#include h 对于#include“filename。 h"编译器从用户工作路径开始搜索filename.h 2头文件的作用是什么? 答: 一、通过头文件来调用库功能。 在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可.用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。 编译器会从库中提取相应的代码. 二、头文件能加强类型安全检查。 如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则,能大大减轻程序员调试、改错的负担。 3C++函数中值的传递方式有哪几种? 答: C++函数的三种传递方式为: 值传递、指针传递和引用传递。 4内存的分配方式有几种? 答: 一、从静态存储区域分配。 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量。 二、在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 三、从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。 动态内存的生存期由我们决定,使用非常灵活,但问题也最多. 5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数; 答: 双向链表删除一个节点P template〈classtype>voidlist〈type〉: : delnode(intp) { intk=1; listnode〈type〉*ptr,*t; 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〈classtype>boollist〈type〉: : insert(typet,intp) { listnode〈type〉*ptr; 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; //统计有多少个’\t’ for(i=0;buf[i]! ='\0';i++){ if(buf[i]=='\t') count++; } //给定的buf空间是否能装下生成的字符串 intj=i+3*count; if(len〈j+1) returnfalse; //从后向前逐个替换 while(count>0) { while(buf[i]! ='\t’) buf[j--]=buf[i-—]; count——; buf[j]=buf[j-1]=buf[j—2]=buf[j—3]=''; j—=4; i—-; } returntrue; } intmain() { charbuf[100]="123\t45\t\t\t6\t\t65\n4234\t5345"; cout<<”Beforechage: "< cout〈〈buf< cout〈〈"Aftercallingthefunction: "〈〈endl; //buf是原字符串,100是buf的长度(要足够大,最好是原字符串的3倍) if(change(buf,100)==true) cout〈 charc; cin〉〉c; } 7Windows程序的入口是哪里? 写出Windows消息机制的流程。 函数WinMain() Windows应用程序的消息处理机制如图1。 2所示。 (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.bublesort//冒泡排序 c.mergesort//归并排序 18。 哪种结构,平均来讲,获取一个值最快B a。 binarytree//二叉树 b。 hashtable//散列表,哈希表 c.stack//栈 19请问C++的类和C里面的struct有什么区别? 答: c++的类的成员默认情况下是私有的,c的struct的成员默认情况下是公共的. 20请讲一讲析构函数和虚函数的用法和作用? 答: 析构函数的名字和类名相同,没有返回值,没有参数,不能随意调用也没有重载.只是在类对象生命期结束时由系统自动调用。 虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联编. 21全局变量和局部变量有什么区别? 是怎么实现的? 操作系统和编译器是怎么知道的? 答: 一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。 全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区. 22一些寄存器的题目,主要是寻址和内存管理等一些知识. 1、立即寻址 2、寄存器寻址 3、直接寻址 4、寄存器间接寻址 5、基址加变址寻址 6、寄存器相对寻址 7、相对基址加变址寻址 238086是多少位的系统? 在数据总线上是怎么实现的? 8086有16根数据线和20根地址线,因为可用20位地址.8086是16位处理器。 24多态。 overload和override的区别。 答: 多态: 接口的多种不同的实现方式即为多态 重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无. 覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字. <〈Sony笔试题〉〉 25.完成下列程序 * *.*. *。 。 *..*。 。 *。 ..*...*。 .。 *... *.。 ..*.。 。 。 *。 ..。 *....*..。 . *。 。 .。 .*。 .。 。 。 *。 .。 ..*.。 ...*.....*。 。 .。 . *......*..。 。 ..*.。 。 .。 .*。 .。 。 。 .*..。 .。 .*.。 。 。 。 。 *..。 。 。 。 *....。 ..*....。 ..*...。 ...*......。 *。 。 。 ...。 *。 .。 .。 。 。 *..。 。 。 。 。 *。 。 。 .。 .。 #include〈iostream> usingnamespacestd; constintn=8; main() { inti; intj; intk; for(i=n;i>=1;i--) { for(j=0;j〈n-i+1;j++) { cout〈<”*"; for(k=1;k〈n—i+1;k++) { cout<<"."; } } cout<〈endl; } system("pause”) } 26完成程序,实现对数组的降序排序 #include〈iostream〉 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++)//曾经在这儿出界 cout〈〈array[i]<〈"”; cout〈〈endl; system("pause”); } voidsort(int*arr,intn) { inttemp; for(inti=1;i<9;i++) { for(intk=0;k〈9—i;k++)//曾经在这儿出界 { if(arr[k]〈arr[k+1]) { temp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=temp; } } } } 27费波那其数列,1,1,2,3,5……编写程序求第十项.可以用递归,也可以用其他方法,但要说明你选择的理由. 非递归 #include usingnamespacestd; intPheponatch(intn); main() { intPh=Pheponatch(10); cout<〈Ph<〈endl; system(”pause”); } intPheponatch(intn) { intelem; intn1=1; intn2=1; if(n==1||n==2) return1; else { for(inti=3;i<=n;i++) { elem=n1+n2; n1=n2; n2=elem; }returnelem;}} 递归 #include usingnamespacestd; intPheponatch(intn); main() { intn; cin〉〉n; intph=Pheponatch(n); cout< system("pause”); } intPheponatch(intn) { if(n〈=0) exit(—1); else if(n==1||n==2) return1; else returnPheponatch(n—1)+Pheponatch(n-2); } 28下列程序运行时会崩溃,请找出错误并改正,并且说明原因. #include〈stdio.h〉 #include h> typedefstruct{ TNode*left; TNode*right; intvalue; }TNode; TNode*root=NULL; voidappend(intN); intmain() { append(63); append(45); append(32); append(77); append(96); append(21); append(17);//Again,数字任意给出 } voidappend(intN) { TNode*NewNode=(TNode*)malloc(sizeof(TNode)); NewNode—>value=N; if(root==NULL) { root=NewNode; return; } else { TNode*temp; temp=root; while((N>=temp。 value&&temp.left! =NULL)||(N value&&temp。 right! =NULL)) { while(N>=temp.value&&temp。 left! =NULL) temp=temp。 left; while(N〈temp。 value&&temp.right! =NULL) temp=temp。 right; } if(N〉=temp。 value) temp.left=NewNode; else temp.right=NewNode; return;}} 29。 AclassBnetworkontheinternethasasubnetmaskof255.255.240.0,whatisthemaximumnumberofhostspersubnet. 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.2nb。 2n-1c.2n+1d。 2n-2 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<〈boolalpha〈〈(str1==str2)〈 0 cout〈 0 cout<〈boolalpha<〈(str5==str6)〈 1 答: 分别输出false,false,true。 str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。 str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc"以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。 43。 非C++内建型别A和B,在哪几种情况下B能隐式转化为A? [C++中等] 答: BD a.classB: publicA{……}//B公有继承自A,可以是间接继承的 b。 classB{operatorA();}//B实现了隐式转化为A的转化 c.classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数 d。 A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个 44.以下代码中的两个sizeof用法有问题吗? [C易] voidUpperCase(charstr[])//将str中的小写字母转换成大写字母 { for(size_ti=0;i〈sizeof(str)/sizeof(str[0]);++i) if('a’<=str[i]&&str[i]〈='z') str[i]-=('a’—’A'); } charstr[]="aBcDe”; cout〈<"str字符长度为: ”〈 UpperCase(str); cout〈〈str< 45.以下代码有什么问题? [C难] voidchar2Hex(charc)//将字符以16进制表示 { charch=c/0x10+'0';if(ch〉'9')ch+=(’A’—'9'—1); charcl=c%0x10+'0';if(cl>'9’)cl+=(’A'-’9’—1); cout< } charstr[]="Ilove中国”; for(size_ti=0;i char2Hex(str[i]); cout<〈endl; 4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 常见 笔试 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)