1、C+面试题1 include “filename.h”和include 的区别?答:对于include 编译器从标准库开始搜索 filename.h对于include “filename.h”编译器从用户工作路径开始搜索 filename.h2 头文件的作用是什么?答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单
2、的规则,能大大减轻程序员调试、改错的负担。3 C+函数中值的传递方式有哪几种?答:C+函数的三种传递方式为:值传递、指针传递和引用传递。4 内存的分配方式有几种?答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 del
3、ete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5 实现双向链表删除一个节点 P,在节点 P 后插入一个节点,写出这两个函数 ;答:双向链表删除一个节点 Ptemplate void list:delnode(int p)int k=1;listnode *ptr,*t;ptr=first;while(ptr-next!=NULLk+;t=ptr-next;coutdatanext=ptr-next-next;length-;delete t;在节点 P 后插入一个节点:template bool list:insert(type t,int p)listnode *
4、ptr;ptr=first;int k=1;while(ptr!=NULLk+;if(ptr=NULLelselistnode *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 != 0; i+) if (bufi = t)count+;/ 给定的 buf 空间是否能装下生成的字符串in
5、t 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“;coutc;7 Windows 程序的入口是哪里?写出 Windows 消息机制的流程.函数 WinMain()Windows 应用程序的消息处理机制如图 1.2 所示。(1 )操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的
6、消息队列中。(2 )应用程序在消息循环中调用 GetMessage 函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用 TranslateMessage 产生新的消息。(3 )应用程序调用 DispatchMessage,将消息回传给操作系统。消息是由 MSG 结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage 函数总能进行正确的传递。(4 )系统利用 WNDCLASS 结构体的 lpfnWndProc 成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消
7、息”)。8 如何定义和实现一个类的成员函数为回调函数?把函数声明为 static9 C+里面是不是所有的动作都是 main()引起的?如果不是,请举例.答:在运行 c+程序时,通常从 main()函数开始执行。因此如果没有 main(),程序将不完整,编译器将指出未定义 main()函数。例外情况:如, 在 windows 编程中,可以编写一个动态连接库(dll)模块,这是其他windows 程序可以使用的代码。由于 DLL 模块不是独立的程序,因此不需要 main().用于专用环境的程序-如机器人中的控制器芯片-可能不需要 main().但常规的独立程序都需要main().10 C+里面如何
8、声明 const void f(void)函数为 C 程序中的库函数?extern “C“ void f(void);11 下列哪两个是等同的 C=Dint b; A const int* a = B const* int a = C const int* const a = D int const* const a = 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 =
9、 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 最快 Ca quick sort /快速排序b.b
10、uble sort /冒泡排序c.merge sort /归并排序18. 哪种结构,平均来讲,获取一个值最快 Ba. binary tree /二叉树b. hash table /散列表,哈希表c. stack /栈19 请问 C+的类和 C 里面的 struct 有什么区别?答:c+ 的类的成员默认情况下是私有的,c 的 struct 的成员默认情况下是公共的 .20 请讲一讲析构函数和虚函数的用法和作用?答:析构函数的名字和类名相同,没有返回值,没有参数,不能随意调用也没有重载。只是在类对象生命期结束时由系统自动调用。虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函
11、数声明为虚函数,作用为使程序支持动态联编。21 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?答:一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区.22 一些寄存器的题目,主要是寻址和内存管理等一些知识。 1、 立即寻址2、 寄存器寻址3、 直接寻址4、 寄存器间接寻址5、 基址加变址寻址6、 寄存器相对寻址7、 相对基址加变址寻址 23 8086 是多少位的系统?在数据总线上是怎么实现的? 8086 有 16 根数据线和 20 根地址线,因为可用
12、 20 位地址.8086 是 16 位处理器.24 多态。overload 和 override 的区别。答:多态:接口的多种不同的实现方式即为多态重载在相同范围(同一个类中),函数名字相同,参数不同,virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有 virtual 关键字。25完成下列程序*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.i 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“)