c,c++面试题 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《c,c++面试题 .pdf》由会员分享,可在线阅读,更多相关《c,c++面试题 .pdf(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.C+的类和 C里面的 struct有什么区别?struct成员默认访问权限为public,而 class 成员默认访问权限为private 2.析构函数和虚函数的用法和作用析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。虚函数是指被关键字virtual说明的函数,作用是使用C+语言的多态特性3.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?1)全局变量的作用用这个程序块,而局部变量作用于当前函数2)前者在内存中分配在全局数据区,后者分配在栈区3)生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局
2、部循环体等内部存在,退出就不存在4)使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用4.有 N个大小不等的自然数(1N),请将它们由小到大排序.要求程序算法:时间复杂度为 O(n),空间复杂度为O(1)。void sort(int e,int n)int i;int t;for(i=1;i t=eei;eei=ei;ei=t;5.堆与栈的去区别A.申请方式不同Stack 由系统自动分配,而heap需要程序员自己申请,并指明大小。B.申请后系统的响应不同Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常Heap:当系统收到程序申请
3、时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删除,并将该结点的空间分配给程序。另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于 delete 语句正确释放空间。而且,由于 找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。C.申请大小限制的不同Stack:在 windows下,栈的大小是 2M(也可能是 1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。Heap:堆是向高地址扩展的数据结构,是不连续的内存
4、区域。这是由于系统是用名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 46 页 -链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。D.申请效率的比较:栈由系统自动分配,速度较快。但程序员是无法控制的。堆是由 new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。另外,在 WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。E.堆和栈
5、中的存储内容栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的 C编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。6.含参数的宏与函数的优缺点宏:优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏
6、本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。函数:优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高PS:宏与内联函数的区别内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是;不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)7.Windows 程序的入口是哪里?写出Windows消息机制的流程Wind
7、ows程序的入口是 WinMain()函数。Windows应用程序消息处理机制:A.操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中B.应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些预处理。C.应用程序调用 DispatchMessage,将消息回传给操作系统。D.系统利用 WNDCLASS结构体的 lpfnWndProc 成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。8.如何定义和实现一个类的成员函数为回调函数A.什么是回调函数?简而言之,回调函数就是被调用者回头调用调用者的函数。使用回调函
8、数实际上就是在调用某个函数(通常是 API 函数)时,将自己的一个名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 46 页 -函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用回调函数。回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。B.如何定义和实现一个类的成员函数为回调函数要定义和实现一个类的成员函数为回调函数需要做三件事:a声明;b定义;c设置触发条件,就是在你的函数中把你的回
9、调函数名作为一个参数,以便系统调用如:一、声明回调函数类型typedef void(*FunPtr)(void);二、定义回调函数class A public:A();static void callBackFun(void)/回调函数,必须声明为static coutcallBackFun=EPSINON)&(x=”或“=”此类形式。如下是错误的写法,不得分。if(x=0.0)if(x!=0.0)请写出 char*p 与“零值”比较的 if 语句。(3分)标准答案:if(p=NULL)if(p!=NULL)如下写法均属不良风格,不得分。if(p=0)if(p!=0)if(p)if(!)二、以
10、下为 Windows NT下的 32 位 C+程序,请计算 sizeof的值(10 分)请计算 void Func(char str100)sizeof(str)=4(2 分)void*p=malloc(100);请计算sizeof(p)=4(2 分)三、简答题(25 分)1、头文件中的 ifndef/define/endif 干什么用?(5 分)答:防止该头文件被重复引用。2、#include 和#include“filename.h”有什么区别?(5 分)答:对于#include,编译器从标准库路径开始搜索 filename.h 名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共
11、 46 页 -对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h 3、const 有什么用途?(请至少说明两种)(5 分)答:(1)可以定义 const 常量(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。4、在 C+程序中调用被 C 编译器编译后的函数,为什么要加extern“C”?(5分)答:C+语言支持函数重载,C语言不支持函数重载。函数被 C+编译后在库中的名字与 C语言的不同。假设某个函数的原型为:void foo(int x,int y);该
12、函数被 C编译器编译后在库中的名字为_foo,而 C+编译器则会产生像_foo_int_int之类的名字。C+提供了 C连接交换指定符号 extern“C”来解决名字匹配问题。5、请简述以下两个for 循环的优缺点(5 分)for(i=0;i if(condition)DoSomething();else DoOtherthing();if(condition)for(i=0;i DoSomething();else for(i=0;i DoOtherthing();优点:程序简洁缺点:多执行了 N-1 次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优
13、点:循环的效率高缺点:程序不简洁四、有关内存的思考题(每小题5 分,共 20 分)void GetMemory(char*p)名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 46 页 -p=(char*)malloc(100);void Test(void)char*str=NULL;GetMemory(str);strcpy(str,“hello world”);printf(str);请问运行 Test 函数会有什么样的结果?答:程序崩溃。因为 GetMemory并不能传递动态内存,Test 函数中的 str一直都是 NULL。strcpy(str,“hello world
14、”);将使程序崩溃。char*GetMemory(void)char p=“hello world”;return p;void Test(void)char*str=NULL;str=GetMemory();printf(str);请问运行 Test 函数会有什么样的结果?答:可能是乱码。因为 GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。void GetMemory2(char*p,int num)*p=(char*)malloc(num);void Test(void)char*str=NULL;GetMemory(&
15、str,100);strcpy(str,“hello”);printf(str);请问运行 Test 函数会有什么样的结果?答:名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 46 页 -(1)能够输出 hello(2)内存泄漏void Test(void)char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL)strcpy(str,“world”);printf(str);请问运行 Test 函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。因为 free(str);之
16、后,str 成为野指针,if(str!=NULL)语句不起作用。五、编写 strcpy函数(10 分)已知 strcpy函数的原型是char*strcpy(char*strDest,const char*strSrc);其中 strDest是目的字符串,strSrc是源字符串。(1)不调用 C+/C的字符串库函数,请编写函数 strcpy char*strcpy(char*strDest,const char*strSrc);assert(strDest!=NULL)&(strSrc!=NULL);/2分char*address=strDest;/2分while(*strDest+=*strS
17、rc+)!=0)/2分NULL;return address;/2分 (2)strcpy 能把 strSrc的内容复制到 strDest,为什么还要 char*类型的返回值?答:为了实现链式表达式。/2分例如 int length=strlen(strcpy(strDest,“hello world”);六、编写类 String的构造函数、析构函数和赋值函数(25 分)已知类 String的原型为:class String public:String(const char*str=NULL);/普通构造函数名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 46 页 -String
18、(const String&other);/拷贝构造函数 String(void);/析构函数String&operate=(const String&other);/赋值函数private:char*m_data;/用于保存字符串;请编写 String的上述 4 个函数。标准答案:/String的析构函数String:String(void)/3分 delete m_data;/由于 m_data 是内部数据类型,也可以写成 delete m_data;/String的普通构造函数String:String(const char*str)/6分 if(str=NULL)m_data=new
19、char1;/若能加 NULL 判断则更好*m_data=0;else int length=strlen(str);m_data=new charlength+1;/若能加 NULL 判断则更好strcpy(m_data,str);/拷贝构造函数String:String(const String&other)/3分 int length=strlen(other.m_data);m_data=new charlength+1;/若能加 NULL 判断则更好strcpy(m_data,other.m_data);/赋值函数String&String:operate=(const String
20、&other)/13分/(1)检查自赋值 /4分if(this=&other)return*this;名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 46 页 -/(2)释放原有的内存资源 /3分delete m_data;/(3)分配新的内存资源,并复制内容/3分int length=strlen(other.m_data);m_data=new charlength+1;/若能加 NULL 判断则更好strcpy(m_data,other.m_data);/(4)返回本对象的引用 /3分return*this;、许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业
21、要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到 10 分中的 2 分。读者可从本文看到strcpy函数从 2 分到 10 分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。2.找错题试题:void test1()char string10;char*str1=“0123456789;strcpy(string,str1
22、);试题 2:void test2()名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 46 页 -char string10,str110;int i;for(i=0;i10;i+)str1i=a;strcpy(string,str1);试题 3:void test3(char*str1)char string10;if(strlen(str1)=10)strcpy(string,str1);解答:试题 1 字符串 str1 需要 11 个字节才能存放下(包括末尾的0),而 string只有 10 个字节的空间,strcpy 会导致数组越界;对试题 2,如果面试者指出字符数组s
23、tr1 不能在数组内结束可以给3 分;如果面试者指出 strcpy(string,str1)调用使得从 str1 内存起复制到 string内存起所复制的字节数具有不确定性可以给7 分,在此基础上指出库函数strcpy工作方式的给 10 分;对试题 3,if(strlen(str1)=10)应改为 if(strlen(str1)10),因为 strlen的结果未统计 0 所占用的 1 个字节。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 46 页 -剖析:考查对基本功的掌握:(1)字符串以0结尾;()对数组越界把握的敏感度;()库函数 strcpy的工作方式,如果编写一个标准
24、strcpy函数的总分值为10,下面给出几个不同得分的答案:2 分void strcpy(char*strDest,char*strSrc)while(*strDest+=*strSrc+)!=0);4 分void strcpy(char*strDest,const char*strSrc)/将源字符串加 const,表明其为输入参数,加2 分 while(*strDest+=*strSrc+)!=0);7 分void strcpy(char*strDest,const char*strSrc)/对源地址和目的地址加非0 断言,加 3 分assert(strDest!=NULL)&(strSr
25、c!=NULL);while(*strDest+=*strSrc+)!=0);名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 46 页 -10 分/为了实现链式操作,将目的地址返回,加3 分!char*strcpy(char*strDest,const char*strSrc)assert(strDest!=NULL)&(strSrc!=NULL);char*address=strDest;while(*strDest+=*strSrc+)!=0);return address;从 2 分到 10 分的几个答案我们可以清楚的看到,小小的 strcpy竟然暗藏着这么多玄机,真不是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c c+面试题 2022 c+ 试题
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内