计算机程序员的一些面试题

来源:百度文库 编辑:神马文学网 时间:2024/04/29 20:49:23
C和C++区别?
1.最根本的区别:
C 是基于过程的,强调的是程序的功能,以函数为中心。C++是面向对象的,强调程序的分层,分类,以抽象为基础,C++的灵魂——继承,多态,运算符重载等,这些都是 C 所没有的。
2.一些小区别:
C 和 C++中都有结构的概念,但是在 C 语言中结构只有成员变量,而没有成员方法,而在C++的结构中,它可以有自己的成员变量和成员函数。C  语言中结构的成员是公共的。而在 C++中这些成员默认的是私有的,除非声明为 public。
---------------------------------------
C++和 JAVA
1.C++容易出现内存泄露,需要手动回收内存。而 JAVA 有垃圾自动回收机制。
2.JAVA 的可移值性更好,JAVA 的类文件能够在不同的平台上使用。而 C++在 windows 下生成的可执行文件在 LINUX 下不一定能运行,可能需要重新编码。JAVA 生成的类可以认为是中间代码,java 文件在 JAVA虚拟机上运行,通过虚拟机来产生最终代码,linux 和 java 下都会有虚拟机。而 C++编译器生成的是最终代码,有时候系统调用在不同的系统下并不能够成功进行。
3.JAVA 是纯面向对象,而 C++是基于对象的。
---------------------------------------
C++的class 和  struct 有什么区别?
从语法上,在C++中class和struct做类型定义时只有两点区别:
1.默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
2.成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。
再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
---------------------------------------
讲析构函数和虚函数的用法和作用
析构函数:在类对象的生命期结束的时候,由系统自动调用,用于释放内存空间。
虚函数:子类继承了父类的一个函数,把父类的该函数设为virtual。在父类的指针指向子类时,如果使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
纯虚函数:如果父类的函数根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数设为virturl 函数名=0,我们把这样的函数(方法)称为纯虚函数。
如果一个类包含了纯虚函数,称此类为抽象类。
---------------------------------------
全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
1.作用域不同;
2.生存周期不同;
3.分配方式不同,全局变量在静态储存区,局部变量在堆栈区。
全局变量在main()前由C、C++运行期函数初始化,如果没有初值,会被初始化为0。
静态局部变量,该变量的作用域为包含变量定义文件, 生存周期从定义开始到程序结束,也是存放在内存的静态存储区域。
---------------------------------------
解释堆和栈的区别
1.分配方式不同,栈是由系统分配释放,而堆是人工分配释放;
2.大小不同,栈很小,堆很大;
3.栈效率高,堆的分配需要通过一定算法来寻找适合的内存空间,所以效率较低;
4.堆容易产生内存碎片,而栈不会。
---------------------------------------
静态链接和动态链接
静态链接的两个缺陷:
1.把同一函数放在多个可执行文件中,大大浪费了存储空间。
2.如果在其中的一个使用函数中发现了错误,则必须重新编译和重新发布调用那个使用函数的每一个可执行文件。
动态链接
为了避免这个问题,开发人员就把函数库编译为独立的二进制文件,每一个可执行文件都可以动态地与那些二进制文件进行链接。这样,几个可执行程序就可以共享相同的二进制库文件,即动态链接库(DLL)。如果想要修改实用程序,只需要重新发布函数所在的 dll 即可,而不必重新编译和发布调用使用函数的所有可执行文件。
---------------------------------------
Windows程序的入口是哪里?写出Windows消息机制的流程。
Windows程序的入口是WinMain函数
消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。
---------------------------------------
如何定义和实现一个类的成员函数为回调函数?
所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。
定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别。
---------------------------------------
C++里面是不是所有的动作都是main()引起的?如果不是,请举例。
不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的。
---------------------------------------
C++里面如何声明const void f(void)函数为C程序中的库函数?
在该函数前添加extern “C”声明。
---------------------------------------
中断发生时 CPU 做什么工作?
1.中断优先级判断;
2.保护中断现场,比如将CPU状态、断点地址等压入堆栈;
3.查询中断入口,执行中断服务子程序(ISR),在中断入口处存放有中断处理程序或者中断处理程序的跳转地址。
4.中断返回,恢复中断现场;
---------------------------------------
CPU在上电后,进入操作系统的main()之前必须做什么工作?
bios启动自检
读取MBR
转到MBR执行它的代码,它会检测活动分区
把活动分区的引导扇区的引导代码装入内存
运行引导代码,引导代码装入该分区的操作系统
进入main()(当然不一定叫main,如linux下叫start_kernel)执行一系列的初始化,然后最终启动登录界面
BIOS是一组固化到电脑内主板上一个ROM芯片上的程序,它保存着电脑最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。
MBR是英文Master Boot Record的缩写,中文意为主引导记录。硬盘的0磁道的第一个扇区称为MBR,它的大小是512字节,而这个区域可以分为两个部分。第一部分为preboot区(预启动区),占446字节;第二部分是Partition table区(分区表),占66个字节,该区相当于一个小程序,作用是判断哪个分区被标记为活动分区,然后去读取那个分区的启动区,并运行该区中的代码。
---------------------------------------
makefile文件的作用是什么?
makefile以文本的方式规定了make命令要编译那些文件,生成那些文件,链接那些文件,文件名等,也支持增量编译。有自己的一套语法规则。
---------------------------------------
计算机的基本组成
五大基本部分:输入设备、存储设备、CPU(运算器和控制器)、输出设备、系统总线。
---------------------------------------
什么是内存泄露?
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
---------------------------------------
cache
Cache,高速缓冲存储器,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 置的内容及这些数据项的
存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。因为高速缓冲存储器总是比主 RAM 存储器速度快,所以当 RAM 的访问速度低于微处理器的速度时,常使用高速缓冲存储器。
Cache 的出现是基于两种因素:首先,是由于 CPU 的速度和性能提高很快而主存速度较低且价格高,第二就是程序执行的局部性特点。因此,才将速度比较快而容量有限的 SRAM 构成 Cache,目的在于尽可能发挥 CPU 的高速度。
---------------------------------------
通道是怎么回事?
一个独立于 CPU 的专门 I/O 控制的处理机,控制设备与内存直接进行数据交换。它有自己的通道命令,可由 CPU 执行相应指令来启动通道,并在操作结束时向 CPU 发出中
断信号。通道指令的格式一般由:操作码,记数段,内存地址段,结束标志组成。一个系统中可设立三种类型的通道:字节多路通道、数组多路通道、选择通道。