《C++常见笔试题及答案(86页).doc》由会员分享,可在线阅读,更多相关《C++常见笔试题及答案(86页).doc(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-C+常见笔试题及答案-第 85 页C+面试题1 include “filename.h”和include 的区别?答:对于include 编译器从标准库开始搜索filename.h对于include “filename.h”编译器从用户工作路径开始搜索filename.h2 头文件的作用是什么?答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一
2、致,编译器就会指出错误,这一简单的规则,能大大减轻程序员调试、改错的负担。3 C+函数中值的传递方式有哪几种?答:C+函数的三种传递方式为:值传递、指针传递和引用传递。4 内存的分配方式有几种?答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时
3、用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5 实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答:双向链表删除一个节点Ptemplate void list:delnode(int p)int k=1;listnode *ptr,*t;ptr=first;while(ptr-next!=NULL&k!=p)ptr=ptr-next;k+;t=ptr-next;cout你已经将数据项 data删除next=ptr-next-next;length-;delete t;在节点P后插入一个节点:template bool list:
4、insert(type t,int p)listnode *ptr;ptr=first;int k=1;while(ptr!=NULL&knext;k+;if(ptr=NULL&k!=p)return false;elselistnode *tp;tp=new listnode;tp-data=t;tp-next=ptr-next;ptr-next=tp;length+;return true;6 写一个函数,将其中的t都转换成4个空格。bool change(char *buf, int len)int count = 0;int i;/ 统计有多少个tfor (i = 0; bufi !=
5、 0; i+) if (bufi = t)count+;/ 给定的buf空间是否能装下生成的字符串int j = i + 3 * count;if (len 0)while (bufi != t)bufj- = bufi-;count-;bufj = bufj - 1 = bufj - 2 = bufj - 3 = ;j -= 4;i-;return true;int main()char buf100 = 123t45ttt6tt65n4234t5345;coutBefore chage:endl;coutbufendl;coutAfter calling the function:endl
6、;/ buf是原字符串,100是buf的长度(要足够大,最好是原字符串的3倍)if (change(buf, 100) = true)cout buf c;7 Windows程序的入口是哪里?写出Windows消息机制的流程.函数WinMain()Windows应用程序的消息处理机制如图1.2所示。(1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。(2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。(3)应用
7、程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。(4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。8 如何定义和实现一个类的成员函数为回调函数?把函数声明为static9 C+里面是不是所有的动作都是main()引起的?如果不是,请举例.答:在运行c+程序时,通常从main()函数开始执行。因此如果没有main(),程序将不完整,编译器将指出未定义mai
8、n()函数。例外情况:如, 在windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main().用于专用环境的程序-如机器人中的控制器芯片-可能不需要main().但常规的独立程序都需要main().10 C+里面如何声明const void f(void)函数为C程序中的库函数?extern C void f(void);11 下列哪两个是等同的 C=Dint b; A const int* a = &b; B const* int a = &b; C const int* const a = &b;
9、D int const* const a = &b;12 内联函数在编译时是否做参数类型检查是13 三个float:a,b,c 问值 (a+b)+c=(b+a)+c 1(a+b)+c=(a+c)+b 114 把一个链表反向填空void reverse(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,5
10、0M的SDRAM)中运行,还需要优化吗? 要。程序在每时每刻都要优化,只要能找到可以优化的方法。优化有多种目的,在200M的CPU中可能需要以速度为重点优化,在300M的CPU中可能要以代码长度为目的优化。17. 下面哪种排序法对12354最快 Ca quick sort /快速排序b.buble sort /冒泡排序c.merge sort /归并排序18. 哪种结构,平均来讲,获取一个值最快 Ba. binary tree /二叉树b. hash table /散列表,哈希表c. stack /栈19 请问C+的类和C里面的struct有什么区别?答:c+的类的成员默认情况下是私有的,c的
11、struct的成员默认情况下是公共的.20 请讲一讲析构函数和虚函数的用法和作用?答:析构函数的名字和类名相同,没有返回值,没有参数,不能随意调用也没有重载。只是在类对象生命期结束时由系统自动调用。虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程序支持动态联编。21 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?答:一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区.22 一些寄存器的题目,主要是寻址
12、和内存管理等一些知识。 1、 立即寻址2、 寄存器寻址3、 直接寻址4、 寄存器间接寻址5、 基址加变址寻址6、 寄存器相对寻址7、 相对基址加变址寻址 23 8086是多少位的系统?在数据总线上是怎么实现的? 8086有16根数据线和20根地址线,因为可用20位地址.8086是16位处理器.24 多态。overload 和 override的区别。答:多态:接口的多种不同的实现方式即为多态重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。25完成下列程序i
13、 ncludeusing namespace std;const int n = 8;main()int i;int j;int k;for(i = n; i = 1; i-)for(j = 0; j n-i+1; j+)cout*;for(k=1; k n-i+1; k+)cout.;coutendl; system(pause)26 完成程序,实现对数组的降序排序i nclude using namespace std;void sort(int* arr, int n);int main()int array=45,56,76,234,1,34,23,2,3;sort(array, 9)
14、;for(int i = 0; i = 8; i+)/曾经在这儿出界coutarrayi ;coutendl;system(pause);void sort(int* arr, int n)int temp;for(int i = 1; i 9; i+)for(int k = 0; k 9 - i; k+)/曾经在这儿出界if(arrk arrk + 1)temp = arrk;arrk = arrk + 1;arrk + 1 = temp;27 费波那其数列,1,1,2,3,5编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。非递归i nclude using names
15、pace std;int Pheponatch(int n);main()int Ph = Pheponatch(10);coutPhendl;system(pause);int Pheponatch(int n)int elem;int n1 = 1;int n2 = 1;if(n = 1 | n =2)return 1;elsefor(int i = 3; i = n; i+)elem = n1 + n2;n1 = n2;n2 = elem;return elem; 递归i nclude using namespace std;int Pheponatch(int n);main()int
16、 n;cinn;int ph = Pheponatch(n);coutphendl;system(pause);int Pheponatch(int n)if(n = 0)exit(-1); elseif(n = 1 | n =2)return 1;elsereturn Pheponatch(n - 1) + Pheponatch(n - 2);28 下列程序运行时会崩溃,请找出错误并改正,并且说明原因。i nclude i nclude typedef structTNode* left;TNode* right;int value; TNode;TNode* root=NULL;void
17、append(int N);int main()append(63);append(45);append(32);append(77);append(96);append(21);append(17); / Again, 数字任意给出void append(int N)TNode* NewNode=(TNode *)malloc(sizeof(TNode);NewNode-value=N;if(root=NULL)root=NewNode;return;elseTNode* temp;temp=root;while(N=temp.value & temp.left!=NULL) | (N=te
18、mp.value & temp.left!=NULL)temp=temp.left;while(N=temp.value)temp.left=NewNode;elsetemp.right=NewNode;return; 29. A class B network on the internet has a subnet mask of 255.255.240.0, what is the maximum number of hosts per subnet .a. 240 b. 255 c. 4094 d. 6553430. What is the difference: between o(
19、log n) and o(log n2), where both logarithems have base 2 .a. o(log n2) is bigger b. o(log n) is biggerc. no difference31. For a class what would happen if we call a classs constructor from with the same classs constructor .a. compilation error b. linking errorc. stack overflow d. none of the above32
20、. “new” in c+ is a: .a. library function like malloc in cb. key word c. operatord. none of the above33. Which of the following information is not contained in an inode .a. file owner b. file sizec. file name d. disk address34. Whats the number of comparisons in the worst case to merge two sorted lis
21、ts containing n elements each .a. 2n b.2n-1 c.2n+1 d.2n-235. Time complexity of n algorithm T(n), where n is the input size ,is T(n)=T(n-1)+1/n if n1 otherwise 1 the order of this algorithm is .a. log (n) b. n c. n2 d. nn36. The number of 1s in the binary representation of 3*4096+ 15*256+5*16+3 are
22、.a. 8 b. 9 c. 10 d. 1237设计函数 int atoi(char *s)。 38int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少? 39解释局部变量、全局变量和静态变量的含义。 40解释堆和栈的区别。 栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.41论述含参数的宏与函数的优缺点。 1.函数调用时,先求出实参表达式的值,然后带入形参。而
23、使用带参的宏只是进行简单的字符替换。2.函数调用是在程序运行时处理的,分配临时的内存单元;而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。3.对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。宏定义时,字符串可以是任何类型的数据。4.调用函数只可得到一个返回值,而用宏可以设法得到几个结果。5.使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。6.宏替换不占运行时间,只占编译时间;而函数
24、调用则占运行时间(分配单元、保留现场、值传递、返回)。 一般来说,用宏来代表简短的表达式比较合适。42. 以下三条输出语句分别输出什么?C易char str1 = abc;char str2 = abc;const char str3 = abc; const char str4 = abc; const char* str5 = abc;const char* str6 = abc;cout boolalpha ( str1=str2 ) endl; / 输出什么?0cout boolalpha ( str3=str4 ) endl; / 输出什么?0cout boolalpha ( str
25、5=str6 ) endl; / 输出什么?1答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。43. 非C+内建型别 A 和 B,在哪几种情况下B能隐式转化为A?C+中等答:BDa. class B : public A / B公有继承自A,可以是间接继承的b. class B operator
26、A( ); / B实现了隐式转化为A的转化c. class A A( const B& ); / A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d. A& operator= ( const A& ); / 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个44. 以下代码中的两个sizeof用法有问题吗?C易void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母for( size_t i=0; isizeof(str)/sizeof(str0); +i )if( a=stri & stri=z )stri -= (
27、a-A );char str = aBcDe;cout str字符长度为: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str 9 ) ch += (A-9-1);char cl = c%0x10 + 0; if( cl 9 ) cl += (A-9-1);cout ch cl ;char str = I love 中国;for( size_t i=0; istrlen(str); +i )char2Hex( stri );cout endl;46. 以下代码有什么问题?C+易struct TestTest( int ) Test()
28、 void fun() void main( void )Test a(1);a.fun();Test b();b.fun();* Test b();/定义了一个函数47. 以下代码有什么问题?C+易cout (true?1:1) temp;unsigned int const size2 = temp;char str2 size2 ;48. 以下代码中的输出语句输出0吗,为什么?C+易struct CLSint m_i;CLS( int i ) : m_i(i) CLS()CLS(0);CLS obj;cout obj.m_i endl;49. C+中的空类,默认产生哪些类成员函数?C+易
29、答:class Emptypublic:Empty(); / 缺省构造函数Empty( const Empty& ); / 拷贝构造函数Empty(); / 析构函数Empty& operator=( const Empty& ); / 赋值运算符Empty* operator&(); / 取址运算符const Empty* operator&() const; / 取址运算符 const50. 以下两条输出语句分别输出什么?C+难float a = 1.0f;cout (int)a endl;cout (int&)a endl;cout boolalpha ( (int)a = (int&)
30、a ) endl; / 输出什么0float b = 0.0f;cout (int)b endl;cout (int&)b endl;cout boolalpha ( (int)b = (int&)b ) =0; -i ) / 反向遍历array数组cout arrayi endl;52. 以下代码有什么问题?STL易typedef vector IntArray;IntArray array;array.push_back( 1 );array.push_back( 2 );array.push_back( 2 );array.push_back( 3 );/ 删除array数组中所有的2f
31、or( IntArray:iterator itor=array.begin(); itor!=array.end(); +itor )if( 2 = *itor ) array.erase( itor );53. 写一个函数,完成内存之间的拷贝。考虑问题是否全面答:void* mymemcpy( void *dest, const void *src, size_t count )char* pdest = static_cast( dest );const char* psrc = static_cast( src );if( pdestpsrc & pdestpsrc+cout ) 能考
32、虑到这种情况就行了for( size_t i=count-1; i!=-1; -i )pdesti = psrci;elsefor( size_t i=0; icount; +i )pdesti = psrci;return dest;int main( void )char str = 0123456789;mymemcpy( str+1, str+0, 9 );cout str endl;system( Pause );return 0;54 线程与进程的区别进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。55:请你分别划划
33、OSI(开放式系统互联)的七层网络结构图,和TCP/IP的五层结构图? 56:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢? IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输57:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的? 交换机用在局域网中,交换机通过记录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需
34、看报文中的IP地址。路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地址但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。58:请问C+的类和C里面的struct有什么区别? (1) C+类中属性默认访问类型为private,而C中的struct默认的访问类型为public(2)c+类可以有继承,虚函数,多态,
35、而C中struct不可以。 C+的class具有数据封装功能,其包含属性访问级别可以为private,public和protect,还具有实现类接口功能和辅助功能的操作函数,而struct属性访问权限只有public,没有数据封装功能,也就没有实现信息隐藏这一面向对象的思想的机制,struct本身不含有操作函数,只有数据。59:请讲一讲析构函数和虚函数的用法和作用? 析构函数是在类对象死亡时由系统自动调用,其作用是用来释放对象的指针数据成员所指的动态空间,如果在构造函数中,你申请了动态空间,那么为了避免引起程序错误,你必须在析构函数中释放这部分内存空间。如果基类的函数用virtual修饰,成为
36、虚函数,则其派生类相应的重载函数仍能继承该虚函数的性质,虚函数进行动态联编,也即具有多态性,也就是派生类可以改变基类同名函数的行为,在面向对象世界中,多态是最强大的机制,虚函数就是这一机制的c+实现方式。60:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的? 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。全局变量分配在全局数据段并且在程序开始运行的时候被加载. 局部变量
37、则分配在堆栈里面。61:一些寄存器的题目,主要是寻址和内存管理等一些知识。 2、交换机用在局域网中,交换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地质。路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地质但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。3、IP协
38、议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输。4、Test b();/定义了一个函数62:8086是多少位的系统?在数据总线上是怎么实现的?63.怎样用最快的方法判断链表是否有环? 设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇,64.c+
39、中引用和指针有什么不同?指针加上什么限制等于引用?答:1 引用被创建的时候必须被初始化,而指针不是必需的。2 引用在创建后就不能改变引用的关系,而指针在初始化后可以随时指向其它的变量或对象。3 没有NULL引用,引用必须与合法的存储单元关联,而指针可以是NULL。65.做的项目,遇到的困难,怎样解决? 69.操作符重载class CMyObject:pulic CObjectPublic:CMyObject();CMyObject &operator=(const CMyObject &my);private:CString strName;int nId:请重载赋值操作符70.链表Struc
40、t structListint value;structList *pHead;Struct LinkedList *pMyList;请编写删除链表的头、尾和第n个节点的程序71.用Socket API制作一个聊天程序,通讯协议使用tcp/ip。要求有简单界面即可,支持多人聊天。72.如果有过工作经验,请说明在先前公司的工作以及离职原因(如无,请说明毕业后的个人展望)73 对于C+中类(class) 与结构(struct)的描述正确的为:A,类中的成员默认是private的,当是可以声明为public,private 和protected,结构中定义的成员默认的都是public;B,结构中不允
41、许定义成员函数,当是类中可以定义成员函数;C,结构实例使用malloc() 动态创建,类对象使用new 操作符动态分配内存;D,结构和类对象都必须使用new 创建;E,结构中不可以定义虚函数,当是类中可以定义虚函数.F,结构不可以存在继承关系,当是类可以存在继承关系.答:A,D,F74,两个互相独立的类:ClassA 和 ClassB,都各自定义了非静态的公有成员函数 PublicFunc() 和非静态的私有成员函数 PrivateFunc();现在要在ClassA 中增加定义一个成员函数ClassA:AdditionalPunction(ClassA a,ClassB b);则可以在Addi
42、tionalPunction(ClassA x,ClassB y)的实现部分(函数功能体内部)出现的合法的表达是最全的是: A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();B,x.PrivateFunc();x.PublicFunc();y.PublicFunc();C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc();D,x.PublicFunc();y.PublicFunc();答:B75,C+程序下列说法正确的有:A,对调用的虚函数和模板类都进行迟后编译.B,基类与子类中函数如果