基本面试题总结
马上要北漂了,最后自己也成为了北漂一族,听说在北京实习生是非常难找工作的。因为企业几乎不要实习生。今年更是个难就业的年。没办法了,自己决定去北京就应该闯一闯。去试一试自己的能力。下面把我这几天看到的(整理的)笔试题总结一下:(附答案和思路)。其实感觉这些题很多都是基础,但是笔试的时候难免会答得不好,所以应该自己总结一下。
1.const于#define有什么不同?
答:(1),const有数据类型,而宏没有数据类型。编译器可以对const常量进行类型检查,而对宏只进行字符串替换没有类型检查。(2),有些编译器可以对const常量进行调试,但不能对宏常量进行调试。(3),const可以用来修饰函数参数,返回值,在C++里还可以用来修饰函数,定义类内中某个成员函数为常量函数。
2.写一个标准的宏MIN,这个宏输入两个参数并返回较小的一个
答:#define MIN(A,B) ((A) <= (B) ? (A):(B)) 第一,宏是方便的产生嵌入代码的唯一方法。第二,三重条件操作符对编译器来说可以产生比if-then-else更优化的代码
第三,必须把宏中的参数括起来(文本替换).
3.内联函数和宏的差别是什么?
答:内联函数和普通函数相比可以加快程序运行速度,因为不需要中断调用。编译时内联函数代码直接嵌入代码中;而宏只是字符串替换。内联函数要做类型检查,相对于宏更安全可靠。inline只用于如下情况:第一,一个函数不断被调用。第二,函数只有简单几行,且函数内部包括for,while,switch等语句。
4.纯虚函数如何定义?使用时应注意什么?
答:virtual void f() = 0; 是接口,子类必须要实现。
5.对于const符号常量,说明下面三种描述的区别:const char* p, char const *p, char* const p
答:1和2相同,如果const为星号左侧,则const就是修饰指针所指向的变量,即指针指向为常量,不能修改指针指向对象的内容;如果const位于星号右侧,就是修饰指针本身,即指针本身就是常量,不能修改指针的指向。
6.static的用途
答:(1) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。(2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块所有函数访问,但是不能被模块外其他函数访问。它是一个本地的全局变量。(3)在模块内,一个被声明为静态的函数只可以被一模块内的其他函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
7.什么是平衡二叉树
答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1
8.为什么构造函数不能声明为虚函数?
答:虚函数采用一种虚调用的方法。虚调用时一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但如果要创建一个对象势必要知道其准确类型因此构造函数不能为虚。
9.写出float x与“零值”比较的if语句
答:if(x > 0.000001 && x < -0.000001).因为浮点数有舍入,所以要用近似数来表示,不能用简单的等号
10.static全局变量与普通的全局变量有什么区别?
答:static全局变量只能在本模块中调用,不能被其他文件单元被引用,而全局变量可以使用extern在任何地方引用。
11.引用和指针有什么区别?
(1).引用必须被初始化,不存在指向空值的引用,一个引用必须指向某个对象。指针不必立即初始化。(2) 引用初始化以后不能改变其指向其他对象,但可以修改其指向对象的内容。指针可以改变其指向的对象。(3)在使用引用之前不需要测试它是否为空,相反指针应该总是被测试防止其为空。(4) 重载操作符必须使用引用才能完成串式操作
12.栈是对程序员透明的
13.数组和链表的区别
答:数组顺序存储,固定大小。链表可以随机存储,大小可动态改变。
14.ASCII码---十进制(对应关系)
答: 0----48 9-----57
A-----65 Z-----90
a-----97 z------122
15.实模式与保护模式。为什么要设计这两种模式?好处在什么地方?分别写出各自的寻址过程
(1)实模式。CPU完全按照8086的实际寻址方法访问从00000H---FFFFFH(1MB大小)的地址范围内存,在这种模式下,CPU只能做单任务运行;寻址公式:物理地址=16*段地址 + 偏移地址。
(2)保护模式。寻址采用32位段和偏移量,最大寻址空间为4GB,在这种模式下系统可以运行多任务,增加了内存空间,增加了对多任务的处理,增加了段页式的内存管理(分段机制使得段具有访问权限和特全级,各个应用程序和操作系统的代码和核心是被保护的)。寻址过程:物理地址 = 由段地址查询全局符号表给出的段基址 + 偏移地址。
16.描述并比较以下对象:事件对象,信号量,临界区,互斥对象。
答:这些对象都是用于线程同步的对象。
(1). 临界区:一种保证在某一时刻只有一个线程能访问数据的简便方法。它只可以再同一进程内部使用。
(2)互斥对象:互斥对象跟临界区相似,但它不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以再不同应用程序的线程之间实现对资源的安全共享。
(3)信号量:使用信号量最重要用途是:信号量允许多个线程同时使用共享资源,它指出了同时访问资源的线程最大数目。
(4)事件对象:用来通知其他进程/线程某操作已经完成。
17.cdecl,stdcall,fastcall是什么?哪种可以实现个数不定的入口参数,为什么?
答:cdecl-------C调用约定,是C/C++默认调用方式,规则是从右往左顺序把参数压入堆栈,由调用者平衡参数栈,可实现可变参数。
stdcall--------Pascal程序的默认调用方式,规则是从右往左顺序把参数压入堆栈,被调用者平衡参数栈
fastcall--------采用寄存器传递参数,特点就是快了
18.进程是资源的集合,线程是代码的执行体。每个线程拥有自己独立的堆栈。dll是被映射到进程空间内作为进程的一部分的,所以线程能执行里面的代码函数,所以本质上DLL没有独立堆栈
19.一句语句实现x是否为2的若干次幂的判断
答: printf("%d",i & (i - 1) ? 0 : 1);
20.在C++程序中,调用被C编译器变异的函数,为什么要加extern "C"?
答:C++函数支持重载,C语言函数不支持重载。所以C++函数编译后的函数链接符号会与C语言函数不同,加extern "C"是让C++函数强制以C函数的链接方式进行链接,使其能够正常调用。
21.C++是不是类型安全的?
答:不是,两个不同类型的指针之间可以强制转换
22.main函数执行之前,还会执行什么代码
答:全局对象的构造函数,然后得到命令行参数的API也会执行,初始化全局堆等等