与程序员面试宝典第18章_第1页
与程序员面试宝典第18章_第2页
与程序员面试宝典第18章_第3页
与程序员面试宝典第18章_第4页
与程序员面试宝典第18章_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 18 章文字解答实战题前面的章节已经介绍了在 C/C+面试中的大部分考点,覆盖了基础知识高级算法的各个方面。本章将之前介绍的知识做试题的介绍和分析,提供一些各大公司的经典和常见试题,以及考题和完整的解题思路分析,帮助读者巩固 C/C+面试的各个考点,通过大量的练习进一步提高实战能力。文字解答题考的是 C/C+程序员的语言基础和工作经验等方面的知识,以及一些简单但是可能设有“陷阱”的计算和程序逻辑推理。C/C+的基础和经验对于反映一个程序员的水平是非常重要的,很多公司在面试时都会准备这种类型的题目。下面将介绍一些常见的经验概念试题以及相关分析和解答。面试题 199介绍 STL,详细说明 ST

2、L 如何实现 vector(面试题)【分析与】STL(标准模版库,Standard Template Library)它由容器算法迭代器组成。本题应聘者对于 STL 的了解。STL 有包括以下一些优点。qqq可以方便容易地实现搜索数据或对数据排序等一系列的算法; 调试程序时更加安全和方便;即使是程序员使用 STL 在 UNIX 平台下写的代码读者也可以很容易地理解(因为STL 是跨平台的)。vector 实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。以下是一段基于 SGI STL 的一个 vector 的实现的代码:#include <alloc.h>/内存分配器头

3、文件,非标准#include <iterator.h>/迭代器头文件,非标准template <class T >/模板类,提供泛型功能class vectortypedef alloc Alloc;/内存分配器 typedef public:typedef T value_type;/值类型 T typedef value_type* pointer;/指针类型 T*typedef value_type* iterator;/迭代器,这里的迭代器不需要,只是一个原生指针的 typedef typedef const value_type* const_iterator

4、; /只读迭代器typedef value_type& reference;/T&typedef const value_type& const_reference; /只读typedef size_t size_type;/长度类型 size_t,一般是 unsigned int;第 18 章 文字解答实战题从示例代码中可以看到,vector 使用 allocator 来进行内存管理,使用 3 个迭代器来引用这存。vector 的 iterator 其实就是 T*的别名。在续的内存里(数组),指针是可以做算术运算的,也支持操作,由此,vector 的 iterator

5、 也支持算术运算,+,-,+=,-=,。vector 的迭代器就是通常的随机迭代器了。面试题 200分析 Visual C+程序出错的使用 Visual C+开发程序经常会遇见这几个错误:LNK2001,C2001,c2005,c2011。请问出现这些错误的是什么?【分析与】在学习 Visual C+的过程中,遇到的 LNK2001 错误的消息主要为 unresolved、externalsymbol“symbol”(不确定的外部“符号”)。本题主要是应聘者是否有足够的经验。如果连接程序不能在所有的库和目标文件内找到所的函数、变量或,将产生此错误消息。一般来说,发生错误的主要有以下两个:(1)

6、是所的函数、变量不存在、拼写不正确或者使用错误。(2)可能使用了不同版本的连接库。编译器错误 C2001:常数中有换行符。字符串常数不能继续到第二行,除非进行此类操作: 用反斜杠结束第一行。用一个双引号结束第一行上的字符串,并在下一行使用另一个双引号开始该字符串。用 n 结束第一行是不够的,例如下面的代码:下一行开始处位于行继续的空格包含在字符串常数中。以上显示的示例都没有将换行符嵌入字符串常数中,可以按如下所示嵌入换行符:printf("Hello,nworld");·239·printf("Hello, world"); /错误p

7、rintf("Hello,nworld"); /错误printf("Hello, world"); /正确printf("Hello,"" world"); /正确typedef ptrdiff_t difference_type; /指针间隔,用来表示两个指针间的距离typedef reverse_iterator<const_iterator, value_type, const_reference, difference_type> const_reverse_iterator;/反向迭代器,定义

8、在<iterator.h> typedef reverse_iterator<iterator, value_type, reference, difference_ type>reverse_iterator;/只读反向迭代器protected:/数据成员typedef simple_alloc<value_type, Alloc> data_allocator;/分配器的 typedefiterator start;/vector 的第一个元素的迭代器,用来表示 vector,永远为 vector.begin(); iterator finish;/ve

9、ctor 的末尾,指向 vector 的最后一个元素的下一个位置。永远为 vector.end(); iterator end_of_storage;/vector 所拥有的内存的末尾。如果等于 vector.end(),表示 vector 已满第 4 篇 C/C+面试题实战编译器错误 C2005:#line 应输入行号,却找到“token”。#line 指令后面必须跟行号。下面的示例生成 C2005:编译器错误 C2011:“identifier”:“type”类型重定义,该标识符已定义为 type 类型。如果多次将某个类型库导入同一个文件,也可能生成 C2011,例如下面的代码:面试题 2

10、01继承和多态有何区别【分析与】本题应聘者对面向对象应用的了解。在 OOD 和 OOP 中,多态组合优于继承。多态的基础是继承,没有继承,多态无从谈起。(1) 对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。(2) 对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。面试题 202有何区别?传指针和比传指针安全,为什么【分析与本题(1)】应聘者对于 C/C+最基础的指针的了解,如下:在创建的同时必须初始化,即到一个有效的对象,而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值。(2)不存在 NULL,必须与合法的单元关联;而指针则可以是 NULL。(3)一

11、旦被初始化为指向一个对象,它就不能被改变为另一个对象的;而指针在任何时候都可以改变为指向另一个对象。给关系。赋值并不是改变它和原始对象的绑定(4)的创建和销毁并调用类的拷贝构造函数。(5)语言层面,的用法和对象一样。在二进制层面,一般都是通过指针来实现的,只不过编译器帮我们完成了转换。不存在空,并且一旦被初始化为指向一个对象,它就不能被改变为另一个对象,显得很安全。const 指针仍然存在空指针,并且有可能产生野指针。总的来说,既具有指针的效率,又具有变量使用的方便性和直观性。·240·struct S;union S;/错误:C2011/ C2005.cpp int ma

12、in()int i = 0;#line i / C2005/ try ./ #line 0printf("Hello,nworld"); printf("Hello,n""world");printf("Hello,""nworld");第 18 章 文字解答实战题面试题 203参数传递的方式与多态参数传递的实现(摩托罗拉面试题)【分析与】参数传递有传值,传指针或者等 3 种,下面作详细介绍。qq传值方式适合一般数值传送,并且不改变原数据,但要消耗内存空间;传指针方式适合传递数组、指针,由于传递

13、的是地址,所以直接操作会改变原 数据;q指针比较类似,是相对比较新的式。一般情况下能用传址的就能用,而且使用更方便一点。基础好的 C/C+程序员应该明白,实现多态主要采用和指针。传值这种方式是复制数据,其类型编译器就已决定,而多态是类型要等到执行期才能决定,所以不使用传值方式来实现多态参数传递。面试题 204怎样应用设计模式的理念【分析与设计模式】考虑的是扩展和重用,而这两方面在很多情况下,往往会被忽略。面试官主要对应聘者未来的发展前景考虑,通过本题了解应聘者对系统分析、整体架构设计方面的经验。虽然设计模式非常关键,不过也不建议程序员不建议用设计模式可能使得简单问题变得复杂化。设计模式,因为不

14、合适的使面试题 205介绍一下对设计模式的理解【分析与】设计模式概念是由设计师 Christopher Alexander 提出:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的次地使用该方案而不必做重复劳动。”上述定义是对设计模式的向对象软件的领域内,就形成了对设计模式的狭义定义。这样,你就能一次又一义。将其应用到面可以简单的认为:设计模式就是解决某个特定的面向对象软件问题的特定方法,并且已经上升到理论程度。下面是框架与设计模式的区别:(1)设计模式和框架对特定业务的问题域。的问题域不同。设计模式面向对象的问题域就是框架针(2) 设计模式比框架更为抽象。设计模式在碰

15、到具体问题后,才能产生代码;框架已经可以用代码表示。(3) 设计模式是比框架更小的体系结构元素。框架中可以包括多个设计模式。例如,设计模式就像武术中基本的招式。将这些招式合理地纵组合起来,就形成套路(框架)。框架就是一种半成品。·241·第 4 篇 C/C+面试题实战面试题 206C+和 C 定义结构的区别是什么(摩托罗拉笔试题)【分析与】C 语言中的结构仅仅是数据的结合,C 语言中的结构体内是不能函数的。面试官要的就是应聘者对这两种语言基础的了解。C+中的结构和类其实具备几乎一样的功能,结构体内也可以函数。C+的结构和类默认具有不一样的属性。面试题 207关于构造函数和析

16、构函数构造函数可否是虚函数?为什么?析构函数呢?析构函数可否是纯虚的呢?【分析与】这是初学者容易的问题。构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。析构函数可以是虚函数,也可以是纯虚函数。面试题 208对拷贝构造函数的深拷贝、浅拷贝和临时对象的理解【分析与】应聘者对于基础知识的了解。深拷贝意味着拷贝了和指针,而浅拷贝只是拷,造成对同一份析构两次,贝了指针,没有拷贝。这样会使得两个指针指向同一份程序。临时对象的开销比局部对象小些。面试题 209基类中有一个虚函数,子类还需要申明为 virtual 吗【分析与】这种情况下不申明为 virtual 是没有关系

17、的。不过,很多程序员也会喜欢使用显式申明,这样可以使得代码更加清晰,增强可读性。面试官主要的其实是程序员对于基础知识的了解,能说出正确的,就说明基础比较扎实。面试题 210C+的类有什么优点C+可以通过精心仅为了实现重用?某些函数功能实现重用,那 C+的类有什么优点吗?是不是仅【分析与】并不仅仅是为了实现重用。(Object Oriented Design,简称 OOD 即面向对象)和(Object Oriented Programming,简称 OOP 即面向对象的程序设计)从根本上改变了程序设计模式和设计思想,具备深远的意义。和·242·第 18 章 文字解答实战题类的

18、 3 大最基本的特征:,继承和多态。这些特征将编程模型从面向过程转变为面向对象,从根本上改变了编写程序的思路和模式。本题应聘者对于面向对象和经验。面试题 211如何实现多态?父类和子类的继承关系如何【分析与】多态的基础是继承,需要虚函数的支持,C+中多态有下面 3 种实现方式:qqq使用函数重载; 使用模板函数;使用虚函数。子类继承父类的大部分。不能继承的有构造函数、析构函数、拷贝构造函数、operator=函数、函数等。面试题 212为什么要引入抽象基类和纯虚函数(摩托罗拉笔试题)【分析与】主要目的是为了实现一种接口的效果。在面向对象的编程语言中,为了更好的表示客观世界。所以有些类可以什么都

19、不实现只是提供一个共享的接口。这就是纯虚函数,而含有纯虚函数的基类即为抽象基类。面试题 213介绍一下模板和容器,如何实现【分析与】模板可以说比较古老了,但是当前使用的泛型编程实质上就是模板编程。它体现了一种通用和泛化的思想。本题的就是模板的基础知识。STL 有 7 种主要容器:vector、list、deque、map、multimap、set 和 multiset。面试题 214什么是 MVC?简单举例说明其应用【分析与】MVC 模式是 Observer 模式的一个特例,典型的有 MFC 中的文档视图架构。本题应聘者对于设计模式的了解,对于先进流行框架的学习程度。面试题 215列举几种进程

20、的同步机制(面试题)【分析与】原子操作、信号量机制、自旋锁、管程、会合、分布式系统。本题对于进程基础知识的深入理解程度,同时要求应聘者一定要知道什么是同步,同步的原理是什么。·243·第 4 篇 C/C+面试题实战面试题 216进程之间通信的途径【分析与】本题进程之间通信的途径主要有以下 3 种:qqq共享系统;消息传递系统;:以文件系统为基础。面试题 217进程死锁的【分析与】死锁是指在两个或多个并发进程中,如果每个进程持有某种而又都等待别的进程它们现在保持着的,否则就不能向前推进。此时,每个进程都占用了一定的但是又不能向前推进,称这一组进程产生了死锁。简单地说,就是两个

21、或多个进程无止境的等候着,永远成立的条件的一种系统状态。产生死锁的根本如下。是系统能够提供的个数比要求该的进程数少,具体q 系统不足;q 进程推进顺序。面试题 218死锁的 4 个必要条件【分析与】如果应聘者能完整的回答此题,则显示出他对基础知识的熟练程度。(1)互斥条件:一个每次只能被一个进程使用。(2)请求与保持条件:一个进程因请求而阻塞时,对已获得的保持不放。 关系。(3)不条件:进程已获得的,在没使用完之前,不能强行(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待面试题 219死锁的处理【分析与】知道如何发现问题,如何解决问题是一个程序员必须面对的任务。本题何处理常见的死锁问

22、题,具体有以下几个方面:(1) 鸵鸟算法忽略该问题。(2) 检测死锁并且恢复。应聘者如(3)仔细地对进行动态分配,以避免死锁。(4)通过破坏死锁产生的 4 个必要条件之一,来防止死锁产生。·244·第 18 章 文字解答实战题面试题 220操作系统中进程调度策略有哪几种【分析与】在考虑这个问题时,首先要考虑操作系统,如果不确定,先要询问面试官,是 Windows系统还是 Linux 系统。如果这两种操作系统应聘者都很熟悉,则直接可以说出这两个系统的区别和进程调度的策略,详细如下:FCFS(先来先服务)、优先级、时间片轮转和多级反馈。面试题 221类的静态成员和非静态成员有何

23、区别【分析与】静态变量使用 static 修饰符进行,在类被实例化时创建,通过类进行不带有static 修饰符的变量称做非静态变量。在对象被实例化时创建,通过对象进行一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。静态函数的实现里不能使用非静态成员,例如非静态变量、非静态函数等。类的静态成员每个类只有一个,非静态成员每个对象一个。本题识的把握程度。应聘者对基础知面试题 222纯虚函数如何定义?使用时应注意什么【分析与】定义方式如下:virtual void f()=0;必须要实现该接口。在 C/C+语言中,纯虚函数的应此函数是一个接口,子类用非常广

24、泛,它如何定义和注意事项,是对基础知识的一种考量。面试题 223数组和链表的区别【分析与本题】C/C+语言的基础知识,应聘者应该了解数组和链表的概念和定义,然后才能具体的区别它们,详细如下。q 数组:数据顺序,固定大小;q 链表:数据可以随机,大小可动态改变。面试题 224关于 ISO 七层模型的典型问题ISO 的七层模型是什么?TCP/UDP 是属于哪一层?TCP/UDP 有何优缺点?【分析与】ISO 的七层模型主要包括:应用层、表示层、会话层、层、网络层、物理链路层、·245·第 4 篇 C/C+面试题实战物理层。TCP/UDP 属于传输层。TCP 服务提供了数据流传输

25、、可靠性、有效流、全双工操作和多路复用技术等。与 TCP 不同,UDP 并不提供对 IP 协议的可靠机制、流以及错误恢复功能等。由于 UDP 比较简单,所以它的头部信息包含很少的字节,比 TCP 负载消耗少。q TCP:提供稳定的传输服务,有流量,缺点是包头大,冗余性不好。q UDP:不提供稳定的服务,包头部信息少,开销小。面试题 225内存的分配方式及其区别【分析与】对于 C/C+语言,因为多是开发操作系统的底层技术,所以内存分配非常关键。下面从多方面解释内存分配方式:(1)从静态区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如,全局变量和 static

26、变量。(2)在栈上创建。在执行函数时,函数内局部变量的单元都可以在栈上创建,函数执行结束时这些单元自动被。栈内存分配运算内置于处理器的指令集。(3)从堆上分配,亦称动态内存分配。程序在运行的时候使用 malloc 或 new 申请任意多少的内存,程序员负责在何时用 free 或 delete内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。面试题 226struct 和 class 的区别【分析与】struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。从习惯上来讲,大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅像一

27、堆缺乏和功能的开放的内存位,而类就像活的并且可靠的成员,它有智能服务,有牢固的屏障和一个良好的定义接口。既然大多数人都这么认为,那么只有在程序员的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的)时,也许应该使用 struct 关键字,否则,应该使用 class 关键字。面试题 227一个类所占内存空间的问题(Autodesk 面试题改编)当一个类 A 中没有任何成员变量与成员函数时,sizeof(A)的值是否可以为 0?请解释一下编译器为什么没有让它为 0。【分析与】肯定不是 0。举个反例,如果是 0 的话,一个 class A10对象数组,而每一个对象占用的内存空间是 0,

28、这时就没办法区分 A0,A1了。这是一个最简单的例子,本例的就是应聘者的反应能力和考虑问题的多面性。·246·第 18 章 文字解答实战题面试题 228在 8086 汇编中,逻辑地址和物理地址如何转换(Intel 面试题)【分析与】首先要明白,为什么特指在 8086 汇编下?因为 C 语言能编译成 8086 汇编语言。本题范围比较宽广,需要应聘者对汇编语言有一定的了解。通用寄存器给出的地址,是偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要的地址。面试题 229比较 C+中的 4 种类型转换方式【分析与】C+同时提供了 4 种新的强制形式(通常称为新风格

29、的或 C+风格的强制):const_cast(expression)、dynamic_cast(expression)、reinterpret_cast(expression) 和 static_cast (expression),每一种都适用于特定的目的,具体如下:(1)dynamic_cast 主要用于执行“安全的向下(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制,也是唯一可能有运行价的强制。(2)static_cast 可以被用于强制隐型转换(例如,non-const 对象为 const 对象,int

30、为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void*指针为有类型指针,基类指针为派生类指针),但是它不能将一个const 对象对象(只有 const_cast 能做到),它最接近于 C-style 的转换。为non-const(3)const_cast 一般用于强制消除对象的常量性。它是唯一能做到这一点的 C+风格的强制。(4)reinterpret_cast 是特意用于底层的强制,导致实现依赖( implementation-dependent)(就是说,不可移植)的结果,例如,将一个指针制在底层代码以外应该极为罕见。为一个整数。这样的强旧风格的强制依然合法,但是

31、新的形式更可取。首先,在代码中它们更容易识别(无论是人还是像 grep 这样的工具都是如此),这样就简化了在代码中寻找类型系统被破坏的地方的过程。其次,更精确地指定每一个强制的目的,使得编译器诊断使用错误成为可能。例如,试图使用一个 const_cast 以外的新风格强制无法编译。来消除常量性,代码将面试题 230面向对象的 3 个基本特征是什么【分析与】应聘者对于面向对象技术的了解,下面是简述:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private,(1)protected,public)。(2)继承:广义的继承有 3 种实现形式:实现继承(指使用基类的属性和

32、方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使·247·第 4 篇 C/C+面试题实战用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)了功能复用的两种方式。(3)多态:是将父对象设置成为和一个或的它的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式将子类类型的指针赋值给父类类型的指针。简单地说,就是面试题 231重载(overload)和重写(overried)的区别【分析与】这是一个经常会考到的题目,从定义上来说具有以下两个方面:(1)重载:是

33、指存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。(2)重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:(1)重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。例如,下面的代码有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,

34、它们的地址在编译期就已经绑定了(早绑定),因此,重载和多态是没有关系的。(2)重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。面试题 232多态的作用【分析与】多态是面向对象开发的一个特色,其作用主要是以下两个。q 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用。q 接口重用:为了类在继承和派生的时候,保证使用性时的正确调用。中任一类的实例的某一属面试题 233ADO 与 ADO.NET 有

35、何异同【分析与】除了能够让应用程序处理于 DBMS 数据库中的数据这一基本相似点外,两者没有·248·第 18 章 文字解答实战题太多共同之处。但是 ADO 使用 OLE DB 接口并基于微软的 COM 技术,而 ADO.NET 拥有的 ADO.NET 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于 COM 体系,ADO.NET 接口也就完全不同于 ADO 和 OLE DB 接口,这也就是说 ADO.NET 和 ADO是两种数据方式。ADO.NET 提供对 XML 的支持。面试题 234New delete 与 malloc free 有何与区别【分析与

36、】C/C+软件工程师在面试的时候内存的特别的多,这是程序安全开发的关键。本题题干中,这两者都是在堆(heap)上进行动态的内存操作。使用 malloc 函数需要指定内存分配的字节数并且不能初始化对象,New 会自动调用对象的构造函数。delete 会调用对象的 destructor,而 free调用对象的 destructor.面试题 235#define DOUBLE(x) x+x,i = 5*DOUBLE(5),求 i【分析与本题主要】函数的宏定义,例如,#define DOUBLE(x) x+x 就是函数的宏定义。把宏定义展开就能计算正确的结果。将其展开:i= 5*6 + 6 = 30。

37、所以,i 为 30。面试题 236哪几种情况只能用 intialization list 而不能用 assignment【分析与】当类中含有 const 和 reference 等成员变量时,基类的构造函数都需要初始化表。本题主要就是初始化关键字,这是 C+中非常基础又非常关键的技术点。面试题 237C+是不是类型安全的【分析与】不是。两个不同类型的指针之间可以强制转换(用 reinterpret cast)。回答本题时,可以先说清楚什么是类型安全,然后解释类型安全的必要性,最后回答结果。当然如果能很干脆地给出结果,也说明了应聘者基础还比较扎实,对待问题的处理不拖泥带水。面试题 238main

38、()函数执行前还会执行什么代码【分析与】全局对象的构造函数会在 main()函数之前执行。笔者曾经在 MSN 上应聘一个的工作,当初方面给的所有的题都是一些包含多个构造函数的对象,的主·249·第 4 篇 C/C+面试题实战要内容就是每个构造函数执行的先后顺序。外企公司特别注意这种题型,而初学者经常在这方面有点。通过此题也希望读者能深化面向对象的知识。面试题 239static 有什么用途(至少说明两种)【分析与】静态变量的类型说明符是 static。静态变量当然是属于静态储方式的变量不一定就是静态变量。例如,外部变量虽属于静态方式,但是属于静态存方式,但不一定是静态变量,

39、必须由 static 加以定义后才能成为静态外部变量,或称静态全局变量。通过上述概念的了解,可以知道 static 的主要用途有以下两个:q 限制变量的作用域;q 设置变量的域。面试题 240描述实时系统的基本特性【分析与】实时系统的特性就是在特定时间内完成特定的任务、实时性与可靠性。本题其实的是应聘者对于实时系统的了解程度。除了解外,还要知道它与 C 语言的关系。面试题 241全局变量和局部变量在内存中是否有区别?说明【分析与】有区别。全局变量在静态数据区,局部变量在堆栈中。本题一看就知道的是基础知识,了解什么是全局变量,什么是局部变量。既然名字不同,那肯定有一定的区别。如果这类问题不上来,

40、那应聘者应该把一本 C 语言入门书从头到尾再读一遍。面试题 242什么是平衡二叉树【分析与】二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作左子树(left subtree) 和右子树(right subtree)。应聘者应先了解什么是二叉树,再去说明什么是平衡二叉树。平衡二叉树的左右子树都是平衡二叉树,且左右子树的深度差值的绝对值不大于 1。面试题 243定义 int *a34,则变量占用的内存空间为多少【分析与】还是常见的对 C 语言的内存如下:,回答占用内存空间应该考虑 16 位和 32 位的问题,在 int *p; /*16 位下 sizeof(p)=2,32 位下 size

41、of(p)=4*/,总共 3*4*sizeof(p)。·250·第 18 章 文字解答实战题面试题 244堆栈溢出一般是由什么导致的【分析与】堆栈溢出一般是循环的递归调用导致的。如果使用的大数据结构的局部变量,也可能导致堆栈溢出。没有回收会导致内存泄露最后耗尽系统内存。如果这个问题说的很清楚,则应聘者在安全开发方面是比较在意的,面试官要的就是 C/C+语言开发的安全问题。面试题 245什么函数不能为虚函数【分析与】构造函数不能为虚函数,如下:(1)所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当

42、在构造父类的构造函数时就不得不显示的调用构造。还有一个就是为了防错,试想如果在子类中一不重写了一个与父类构造函数一样的函数,那么父类的构造函数将被覆盖,这样的话既不能完成父类的构造也会出错。(2)虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函数的初始化列表中必须为基类给出参数。面试题 246冒泡排序算法的时间复杂度是什么【分析与】冒泡排序是这样实现的:首先将所有待排序的数字放入工作列表中。从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于它的下一位,则将它与它的下一位交换。重复上述步骤

43、,直至再也不能交换。冒泡排序的平均时间复杂度与同,也是平方级的,但也是非常容易实现的算法。冒泡排序的时间复杂度是:O(n2)。排序相面试题 247写出 float x 与“零值”比较的 if 语句【分析与】x 是一个变量,被定义为 float,所以在比较时,零值并不是 0,而是以下代码:if(x>0.000001&&x<-0.000001)一般来说,对于一个浮点数,只定义了不使用。通常我们都会对浮点数进行比较复杂的运算,那么在运算的过程中,就有可能发生四舍五入的情况。所以,对于一个进行了一些可能导致四舍五入的运算的浮点数而言,不能保证它的准确性(当然这里的误差是&#

44、183;251·第 4 篇 C/C+面试题实战非常非常小的)。所以,在对浮点数比较的时候,就需要考虑到这些误差,方法之一就是,让浮点数与一段数值范围比较,而不是与一个确定的数值比较。面试题 248Internet 采用哪种网络协议?介绍该协议的主要层次结构【分析与】Internet 采用的是 TCP/IP 协议。TCP/IP 协议的主要层次结构为 5 层:应用层、传输层、网络层、数据链路层和物理层。本题的是网络相关知识,需要对网络的层次结构和协议有一定的了解。这些内容非常基础,如果应聘网络方面的工程师,则这些问题必须能回答上来。面试题 249Internet 物理地址和 IP 地址转

45、换采用什么协议【分析与】采用 ARP(Address Resolution Protocol)即地址ARP 协议的基本功能就是通过目标设备的 IP 地址,协议。目标设备的 MAC 地址,以保证通信的顺利进行。地址换成目标 MAC 地址的过程。(address resolution)就是主机在帧前将目标 IP 地址转面试题 250IP 地址的编码分为哪两部分【分析与】IP 地址由两部分组成:网络号和主机号。不过是要和“子网掩码”按位与上之后,才能区分哪些是网络位哪些是主机位。本题也是的网络相关知识。如果是普通的 C/C+工程师,可能这方面的问题,专门做通信或语音等相关方面的网络工程师,本题很常见

46、。面试题 251不能做 switch()的参数类型是什么数据类型【分析与switch(表数不能为实型。switch()表】),表可以是整型、字符型以及枚举类型等表。switch()的参是常见的分支选择语句,在多条件时经常遇到,为了更好的使用它,一定要了解这方面的知识,本题就是应聘者的编程经验,因为如果你经验丰富,则这种编程中常用表的注意事项难不倒应聘者。面试题 252尽可能多地说出 static 和 const 关键字的作用【分析与】static 关键字至少有下列 n 个作用:·252·第 18 章 文字解答实战题(1)函数体内 static 变量的作用范围为该函数体,不同

47、于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。(2)在模块内的 static 全局变量可以被模块内所用函数数。,但不能被模块外其他函(3)在模块内的 static 函数只可以被这一模块内的其他函数调用。这个函数的使用范围被限制在它的模块内。(4) 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。(5) 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能类的 static 成员变量。const 关键字至少有下列 n 个作用:(1)欲一个变量被改变,可以使用 const 关键字。在定义该 co

48、nst 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了。(2)对指针来说,可以指定指针本身为 const;也可以指定指针所指的数据为 const, 或二者同时指定为 const。(3)在一个函数能改变其值。中,const 可以修饰形参,表明它是一个输入参数,在函数内部不(4) 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量。(5) 对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“”,例如下面的代码:const classA operator*(const classA& a1,const cl

49、assA& a2);operator*的返回结果必须是一个 const 对象。如果不是,这样的代码也编译出错:操作(a * b) = c 显然不符合编程者的初衷,也没有任何意义。%注意:看到上面的代码,读者也许会觉得有一点惊讶。很普通的 static 和 const 居然有这么多功能,这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,如果没有一定的知识广度和深度,不可能对这个问题给出全面地解答。大多数人只能回答出 static 和 const 关键字的部分功能。面试题 253什么是预编译【分析与】预编译就是处理#开头的指令。例如,拷贝#include 包含的文件代码

50、,#define 宏定义的替换和条件编译等。预编译就是为编译做的预备工作的阶段,主要处理#开始的预编译指令。预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在位置。何时需要预编译,具体如下:的任何·253·classA a, b, c;(a * b) = c;/对 a*b 的结果赋值第 4 篇 C/C+面试题实战(1)总是使用不经常改动的大型代码体。(2)多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。面试题 254写一个,使其输入两个参数,返回较小的一个【分析与本题就是】宏定义,注意最后没有

51、分号结尾。详细代码如下:.#define Min(X, Y) (X)>(Y)?(Y):(X) /结尾没有;面试题 255系统中如何用 C 语言编写死循环【分析与】如果不是常面试的人可能不知道,题目竟然是要使用 C 语言来编写死循环,这不是影响程序的进行嘛?但笔者面试过很多公司,这个问题还是非常多见的。因为题目的前提是系统中经常遇到无限循环,也就是我们while(1)或者 for(;)的死循环。如下:面试题 256int (*s10)(int)表示什么【分析与】学习 C 语言时,觉得指针是最基础却又最难的一项技术,面试题基本都会碰到,但一旦学习好它,就很容易过关。本题的就是数组指针。int

52、 (*s10)(int)函数指针数组,将每个指针指向一个 int func(int param)的函数。面试题 257下列表哪些会被编译器(面试题)题目:【分析与】指针和变量定义相关方面的知识,非常基础,如下:·254·int a=248; b=4;int const c=21; const int *d=&a; int *const e=&b;int const *f const =&a;*c=32; d=&b;*d=43;e=34;e=&a; f=0x321f;第 18 章 文字解答实战题(1)*c 语法错误,所以。(2)*d 已

53、经定义了是 const,所以(3)e = &a 已经定义了是 const,所以。(4)const *f const =&a,。面试题 258换两个变量的值而不使用第 3 个变量,即 a=3,b=5,交换之后 a=5,b=3【分析与】有两种解法:一种是使用算术算法,另一种是使用(异或)。示例代码如下:和:面试题 259C 和 C+中的 struct 有什么不同【分析与】在 C 和 C+中,struct 的主要区别是 C 中的 struct 不可以含有成员函数,而 C+中的struct 可以。在 C+中 struct 和 class 的主要区别在于默认的存取权限不同,struct

54、默认为public,而 class 默认为 private。面试题 260如何让程序跳转到绝对地址 0x100000 去执行要对绝对地址 0x100000 赋值,可以用(unsigned int*)0x100000 = 1234。那么如何让程序跳转到绝对地址 0x100000 去执行?【分析与】 *(void (*)( )0x100000 ) ( );首先要将 0x100000 强制转换成函数指针,即:(void (*)()0x100000;然后再调用它,即: *(void (*)()0x100000)();用 typedef 可以看得更直观些,如下:·255·typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)();a = ab;/ 只能对 int,char. b = ab;a = ab; ora = b = a;a = a + b; b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论