C++ Summary for Interview


C++ Summary for Interview
2011年06月21日
  吼吼,,个人邮箱 [email protected] 有事联系......
  
  
  
  
  
  
  
  
  
  
  C++快速入门
  技术面试人员经常会准备一些基本的C++问题,如果有人只是说听说过C++而已,就简历中写上"有C++经验"想要滥竽充数,这些问题就能验明他们的正身,而无法蒙混过关。这种问题可能在"电话场景"中就会问到,在叫你参加现场面试之前先由一个开发人员或招聘人员打电话给你。也可能是通过电子邮件或当面询问。在回答这些问题时,要记住,面试人员只是想知道你确实尝过并使用过C++。一般不需要为获得高分过于深入到每个细节中。
  要点: 原型:int main( int argc, char* argv[]); 限制作用域,防止使用不同库的重名问题。 语言基本知识,如循环语法,三元操作符和变量
  栈和堆之间的差别
  动态分配的数组
  涉及到内存的东西,可以用画图来解释,更加清晰。 const 声明的时候,总是修饰它左边最近的。
  可以声明类的成员函数,表示该函数不能修改数据成员。
  使用const 引用,增加函数传参效率(包括构造函数的初始化参数列表初始化const 引用成员)。
  常见问题:
  基本C++问题一般会采用术语测试的形式提出。面试人员可能让你定义一些C++术语,如const 或static。你要回答出课本上和答案就可以让面试人员满意,不过,如果你再给出一个使用示例或提供额外的一些细节,可能会得到加分。例如,除了说明const的一个作用是可以指定引用参数不能被修改,还可以指出在向函数或方法传递一个对象时,const引用要比复制对象效率更高。
  基本C++问题还可能以另一种形式出现,也许让你当着面试人员的面编写一个小程序。他会给你一个"热身"问题,如"用C++写Hello,world"程序。如果拿到这样一个看来很简单的问题,你要保证能充分展现自己的技能来获得所有加分,如可以使用命名空间,使用流而不是printf(),而且要知道应该包含哪些标准头文件。
  设计专业的C++程序
  面试人员可能想确定你除了知道C++语言外,对如何应用这种语言也很精通。在此并不是明确地问你一个设计问题,不过好的面试人员会把许多技术"暗藏"在其他一些问题中,后面就会看到。
  要点: 设计是主观的,要准备好在面试中为你的设计决定"辩护"、
  在面试之前,回忆一下以前所做的设计的一些细节,以备面试时可能会要求你提供一个例子。
  准备好可能要定义抽象(abstraction)这个术语,并提供一个例子。
  外部接口和底层实现分离开。 准备好可能会让你指出代码重用有哪些好处。
  没必要任何东西都从底层做起,可以应用已有的东西。 准备好要以可视化方式画一个设计,包括类层次体系。
  可以画成树型结构。
  常见问题:
  面试人员一般很难提问设计问题,在面试情况下无论编写多大的程序,也不足以展示实际的设计技能。设计问题可能会以一种比较模糊的方式提出"告诉我设计一个好的程序有哪几步?"或者"请解释抽象的原则"。还可能更隐含一些,在讨论你先前的工作时,面试人员可能会说"你能解释一下那个项目的设计吗?"。
  基于对象的设计
  面向对象设计问题可以把C程序员从C++程序员中筛出来,C程序员只知道引用是什么,而C++程序员确实会使用C++语言的面向对象特性。面试人员不会想当然地相信你,即使你使用面向对象语言已经很多年了,他们还是希望看到真正的证据来表明你确实理解面向对象方法。
  要点: 类是一种描述,一个封装;对象的类的一个具体实现。(举个例子) Is-a是继承;has-a是聚合(类中引用了另一个类的对象) Has-a代替is-a 常见问题:
  面向对象设计问题一般有两种问法。可能让你宣言一个面向对象概念,或者可能让你画出一个面向对象层次体系。前者相当简单。要记住提供例子可以给你加分。
  如果让你画出一个面向对象层次体系,面试人员通常会提供一个简单的应用,如扑克牌游戏,你应该能为这个游戏设计一个类层次体系。面试人员经常会问有关游戏的问题,因为这是大多数人熟悉的应用。与数据库实现之类的问题相比,这些游戏问题还可以稍微活跃一下气氛。当然,取决于所问到的游戏或应用,你生成的层次体系可能有很大的差别。以下是要考虑的一些要点: 面试人员想了解你的思考过程。要把想法充分表现出来,进行头脑风暴,与面试人员一同讨论,不要怕和面试人员的观点不一致。
  面试人员可能认为你对所问的应用已经很熟悉。如果你从来没有听说过21点扑克牌游戏,可以指出来,让面试人员把问题说清楚一些,或者换个问题。
  除非面试人员要求你在描述层次体系时使用一种特定的格式,否则,建议你的类图采用继承树的形式,并为每个类提供一个大致的方法和数据成员列表。
  你可能要为你的设计"辩护",或者把新增加的需求考虑在内,对设计进行修改。
  要搞清楚面试人员到底是什么目的,是想看你的设计中是否存在问题,还是就是要故意与你有不同观点,来看你的说服力如何。
  基于库和模式的设计
  你的准老板想知道你能不能使用并不是你写的代码。如果你的简历中罗列了一些特定的库,就应该准备好回答有关的问题。如果没有,对库的重要性有一个一般的理解就足够了。
  要点: 充分考虑这两者的代价 从O记法的基础知识(或者,至少要记住O(n log n) 要优于O())(注:这种说法只适用于问题规模大的情况) 
  C++标准库中包含的功能
  C标准库、字符串、I/O流、国际化、智能指针(auto_ptr)、异常、数学工具、标准模板库(STL容器&STL算法)
  STL还少些什么: 常见问题:
  如果面试人员问有关一个特定库的内容,他可能会强调库的高层方面而不是技术细节。例如,本书作者之一就经常问应聘者这样一个问题,从库设计的角度看,STL的优点和缺点是什么。最好的应聘者会指出STL的广度和标准化是它的强大之处,但它的学习曲线很陡,这是STL的主要缺点。
  重用设计
  面试人员很少会问到设计可重用代码的问题。疏忽了这一点会带来不好的后果,如果只会写一次性代码的程序员通过了面试,得到机会参加团队开发,他们往往会对整个编程组织带来危害。有时,你可能发现某个公司特别强调代码重用,在面试时会问到这方面的问题。如果真的问到了重用方面的问题,这就表明这是一家不错的公司,值得你为它效力。
  要点: 一般性和易用性 常见问题:
  有关重用的问题大多都有关于你先前开发过的项目。例如,如果你曾经为某家公司工作过,该公司同时推出两套视频编辑应用,分别面向普通消费者和专业人员,面试人员可能就会问这两个应用之间如何共享代码。即使没有明确地问你有关代码重用的问题,你也能"隐藏"地谈到。在介绍你发前的工作时,可以告诉面试人员你写的模块是否用于其他项目中。即使是回答相当直接的编码问题,也一定要考虑并提到所涉及的接口。
  充分利用软件工程方法
  如果你顺利地通过了一家公司的整个面试,但是面试人员从头到尾都没有问到任何过程问题,你就要有所怀疑了,这可能说明这家公司根本没有过程,或者他们不关心过程。还有一种可能,也许他们不希望你被他们的庞大过程吓跑。大多数情况下,你都有机会问公司一些问题。建议你考虑把工程过程作为标准问题之一。
  要点: 有机会参与专业编程的人都应该见过,有的同事的代码编写得相当简明。如果一个人编写的代码一塌糊涂,肯定没有人愿意同他共事。所以面试人员有时想明确应聘人员在编码风格方面的技能。
  要点: 风格问题,即使面试问题并不是明确地与风格有关!
  写得好的代码不需要太多注释。
  注释可以传达一些元信息
  分解的原则
  重构的原则
  命名技术
  类和对象
  关于类和对象,可能问到的问题门类相当繁多。有些面试人员比较看注语法,可能会给你看(或者让你编写)一些复杂的代码。另外一些可能不太关心实现,而对你的设计技能更感兴趣。
  要点: 基本类定义语法
  方法和数据成员的访问限定符
  this指针的使用
  对象创建和撤销
  编译器在哪些情况下会为你生成构造函数
  初使化列表
  复制构造函数和赋值操作符
  mutable关键字
  方法重载和默认参数
  探索继承技术
  有关继承的问题一般与类问题形式相同。面试人员可能还要求你实现一个类层次体系来表明你确实用过C++,而且用得不少,能够派生子类,而不仅仅只是书面了解。
  要点: 派生一个类的语法
  从子类的角度看,私有(private)和保护(protected)的区别
  方法覆盖和虚方法
  不要犹豫,将所有的方法都声明为virtual 向上类型转换会发生"切割",直接用指针和引用则不会;
  向下类型转换有时是必须的,但应该用dynamic_cast。 常见问题:
  继承问题中的许多陷阱都与细节有关。在编写一个基类时,不要忘记给方法加上关键字virtual。如果把所有的方法都加上virtual,要准备好应该能解释这种做法。要能解释virtual 的含义及其原理。类似地,在子类宣言中,不要忘记不父类名的前面加上public关键字(例如 class Foo : public Bar)。一般不会在面试时让你完成多重继承。
  更有难度的继承问题与超类的子类的关系有关。一定要明白不同访问级别如何工作,以及私有和保护之间的区别。要提醒自己一种称为切割的现象,即某些类型的强制转换会导致一个类其子类信息。
  利用模板编写通用代码
  作为C++中最神秘的一部分,面试人员会充分利用模板把c++新手从高手中区分出来。如果你没有记住某些高级模板语法,尽管大多数面试人员都会原谅你,但是你起码要展示出你了解基本的模板语法。
  要点 如何编写一个基本的模板类
  模板的两个主要缺点,语法难看和代码膨胀
  如何使用模板类
  常见问题
  许多面试问题都会从一个简单的问题入手,然后逐步增加复杂度。通常,面试人员准备的问题复杂性可以无限延伸,他只是想知道你能够应付到哪一级,比方说,面试人员开始时可能要求你创建一个类,为固定数目的int提供顺序访问。接下来,可能要求这个类能够扩展以适应一个任意大小的数组。然后,可能需要有任意的数据类型,在这里模板可以上场了。在此之后,面试人员可以让问题朝着不同的方向发展,比如让你使用操作符重载来提供数组型的语法,或者继续沿着模板的道路让你提供一个默认类型。
  一般不会明确地问模板问题,模板更有可能在解决其它编码问题时用到。你应该好好复习有关的基础知识,以备出现这种问题。不过,大多数面试人员都知道模板语法很难,在面试时要求写出复杂的模板代码有些过于苛刻。
  理解c++疑难问题
  许多面试人员可能想强调一些更难解的情况,这样一来,有经验的c++程序员就能充分发挥,表现出他们连C++这些不寻常的领域也能够征服。有时面试人员想问一些有意思的问题,但是可能有困难,最后只好问他们能想到的最难解问题。
  要点 引用在声明时必须与变量绑定,而且这种绑定不能改变。
  const的多种使用
  const变量、const引用、const方法 static数据成员和方法、static连接(对应extern)、函数中的static变量 const_cast、static_cast、dynamic_cast、reinterpret_cast
  有效的内存管理
  低级程序员或有C背景的C++程序员可能会问到与内存有关的问题。目的是想确定你是否过于重视C++的面向对象方面,而忽略了底层实现细节。你可以把内存管理问题作为一个机会,来证明你确实知道底层的具体工作。
  要点 画出栈和堆将有助于你理解底层的具体工作。
  使用new和delete而不是malloc()和free()。
  对数组使用new[]和delete[]。如果有一个对象指针数组,还需要为各个单个指针分配内存,数组分配语法并没有考虑指针的情况。
  或者,你总能这么说"当然,在实际中,我可以具体运行来找出问题。"
  常见问题
  在查找bug的问题中通常包含内存问题,如双重删除,new/new[] 不匹配和泄漏等。在查看大量使用指针和数组的代码时,可以在分析每行代码时画出并更新内存的状态。即使你能马上看到答案,这样做也能让面试人员知道,你确实能够画出内存状态。
  要看应聘人员是否理解,还有一个好办法,就是让他回答指针和数组有什么区别。
  揭开C++ I/O的神秘面纱
  如果你应聘一份编写GUI应用的工作,可能不会问你太多有关I/O流的问题,因为GUI应用会使用其它机制来完成I/O。不过,流可能会在其他问题中出现,而且,作为C++的一个标准部分,只要面试人员关心,肯定就会问到这方面的问题。
  要点 流定义
  使用流的基本输入和输出
  管理器的概念
  流的类型(控制台、文件、字符串等等)
  错误处理技术
  国际化的重要性
  宽字符wchar_t(L"m");wcout.imbue(locale("en_US"));
  常见问题
  I/O可以在任何问题中出现。比如说,面试人员可能让你读入一个包含测验分数的文件,再把读入的分数放在一个vector中。这个问题可以测试你的基本C++技能以及对基本STL和基本I/O的理解。即使I/O只是所处理问题的一个小部分,也要仔细检查是否存在错误。如果没有很好地检查I/O错误,本来很好的程序也会让面试人员有些微辞。
  你的面试人员可能不会专门问有关国际化的问题,不过在面试时如果使用wchar_t而不是char,就能表现出你考虑到了国际化情况。如果确实要让你说说对国际化有什么经验,一定要提到从一开始就考虑国际化的重要性,还要表明你了解C++本地化工具。
  错误处理
  管理层有时不太会让刚刚毕业的研究生或新手承担一份重要的工作,因为一般认为他们写不出成品质量的代码你可以在面试过程中展示你的错误处理技能,从而向面试人员证明你不是泛泛之辈。
  要点 将异常捕获为const引用。
  对于成品代码,异常体系更可取,而不只是几个通常而已。
  C++中的抛出列表与Java中的抛出列表有所不同。
  在抛出异常时智能指针有助于避免内存泄漏
  常见问题
  你可能会拿到一个与异常直接有关的问题,除非会问得更为特定,如让你描述栈展开是如何进行的。不过,面试人员可能会特别留意你如何报告和处理错误。
  当然,并不是所有程序员都理解或赞同异常。有些程序员出于性能原因甚至反对使用异常。如果人员让你完成某个工作时不要用异常,你就必须"还原"为传统的NULL检查和错误码。这是一个好机会,可以让你展示自己了解nothrow new!
  重载C++操作符
  在面试时,有可能不只是让你完成一个简单的操作符重载,而是要完成某个更难的工作,尽管这种情况比较少见。有些面试人员可能会准备一个高级问题,他们并不指望每个人都能正确地做出回答。操作符重载的复杂性使之完全可以作为这样的高级问题,因为很少有程序员在不检查的情况下一次就把语法写对。这说明,面试前应该好好看看这个方面。
  要点 重载流操作符,因为这是最常见的重载操作符,而且概念上是特有的。
  函数对象是什么,如何创建函数对象。
  在方法操作符和全局码元函数之间如何选择。
  有些操作符可以用其它操作符表示(也就是说,operator的结果取反)。
  这里允许重载,后面的const是着急
  Int& operator[](int x);
  Const int& operator[](int x) const;
  常见问题
  要接受一个现实:操作符重载问题(除了简单的操作符重载)确实很苛刻。问这种问题的人都知道这一点,所以如果你回答正确,肯定会对你印象加深。要想预计到具体会问你什么问题,这往往不太可能,但是操作符是有限的。只要你看过每个可重载操作符的重载例子,你就会有很好的表现。
  除了让你实现一个重载操作符,还可能让你回答有关重载扣件符的高级问题。查找bug的问题可能包含有一个重载操作符,但是这个操作符重载为完成某种不合适的行为,妈并不是这个操作符从概念上讲本应完成的行为。除了语法处,还要牢记操作符重载的用例的理论。
  编写高效的C++程序
  效率问题在面试中很常见,国为许多组织都遭遇到代码的可扩展性问题,特别需要在性能方面精通的程序员。
  要点 语言级效率很重要,但是这方面的改进是有限的。从最后看来,设计级选择更为重要。
  引用参数效率更高,因为引用参数可以避免复制。
  对象池有助于避免创建和撤销对象的开销。
  测评非常重要,可以确定哪些操作确实占用了大部分的运行时间。
  常见问题
  通常,面试人员会使用他们自己的产品作为例子来提问效率问题。有时面试人员会描述一个原来的设计,并指出他遇到的一些与性能有关的症状,要求应聘人员提出一个新的设计来解决这个问题。遗憾的是,面试人员可能已经解决了这个问题,而你的解决方案与他的解决方案安全相同的可能性微乎其微,这正是此类问题的一个不合适的地方。因为可能性很小,所以更要仔细检查你的设计。也许提出的不是面试人员的解决方案,但是你的答案也许也是正确的,没准比他的新设计更好。
  还可能有其他类型的效率问题,比如让你高速某些C++代码来改善性能,或者描述某个算法。例如,面试人员可能给你看一段代码,其中包含太多复制或低效的循环。
  开发跨平台和跨语言的应用
  程序员提交的简历中都很少只列一种语言或一种技术,而且大型应用也很少只利用一种语言或技术。即使你只是应聘一份有关C++的工作,面试人员也可能会问到有关其它语言的问题,特别是其他语言与C++的关系。
  要点 常见问题
  最常见的跨语言问题是对两种不同语言进行比较。你不要对某种语言发表溢美或贬低之辞,即使你确实不喜欢Java。面试人员只是想知道你能够了解到不同语言之间的权衡,并能做出选择。
  跨平台问题常常在讨论以前工作的时候问到。如果你的简历中称你曾经在一个定制的硬件平台上编写过C++应用,就要准备好谈一谈你用的编译器,并指出使用那个平台时有哪些难题。
  熟练地测试
  你的准老板会对高超的测试能力大加赞赏。国为你的简历可能无法展示测试技能,除非你有QA经验,否则面试时就会遇到有关测试的问题。
  要点 黑盒测试的白盒测试的区别
  单元测试的概念,以及编写代码时同时编写测试
  更高级的测试技术
  你以前工作的测试和QA环境:哪些可取,哪些不可取?
  常见问题
  面试人员可能要求你在面试时编写一些测试,不过在面试时写出的测试程序往往不太可能有足够的深度,不能算是有趣的测试。更有可能让你回答高级测试问题。要准备好介绍你的上一个工作中测试是如何完成的,还要指出你觉得其中哪些可取,哪些不可取。等你回答完之后,也可以问问面试人员的看法,这是一个很好的问题。在理想情况下,你们将就此展开对测试的讨论,还能让你对将来的工作环境有一个更好的了解。
  征服调试
  工程组织所需要的应聘人员是这样的,他们不仅能调试自己的代码,还能调试他们以前从未见过的代码,技术面试人员通常想衡量你的高度能力究竟如何。
  要点 调试不是在bug出现时才开始,你应当提前在代码中做准备,以便出现bug时能够从容应对。
  日志和调试工具是最好的帮手。
  Bug的症状可能表现得与实际的根本原因毫不相干。
  内存图表有助于完成调试,特别是在面试过程中更需要画出内存图表。
  常见问题
  在面试时,你可能会被一个很复杂的调试问题难住。要记住,过程是最重要的,面试人员也可能知道这一点。即使你在面试过程中没有找出bug,但是要让面试人员知道,你想通过哪些步骤找出问题所在。如果面试人员给你一个函数,指出它在运行时出问题了,如果应聘人员正确地说出了查找bug的一系列步骤,即使他没有马上找出bug,面试人员也会给他同样的加分。
  标准模板库
  可以看到,STL可能很难使用。面试人员一般不会指望你背出STL类的细节,除非你声称自己是一个STL专家。如果你知道你所面试的工作会大量使用STL,就需要在面试前一天写一些STL代码来恢复记忆。否则,复习STL的高级设计就应该足够了。
  要点 vector的重新分配内存问题(效率、导致迭代器无效) 关联容器的用法,如map
  STL算法和一些内置算法的用途
  如何扩展STL(往往不太需要细节)
  模板、迭代器、对外接口 常见问题
  如果面试人员特别热衷于问详细的STL问题,能够问到什么确实没有止境。如果你对语法不太肯定,可以在面试时表明"当然在实际中,我会在〈C++高级编程〉里查,不过肯定它会这样工作……"。至少这会让面试人员感觉到,只要你基本思想正确,细节上有出入是可以原谅的。
  有关STL的高级问题通常用来衡量你用过多少STL,而不会让你加快所有细节。例如,一般的用户可能熟悉关联和非关联容器。比较高级的用户能够定义一个迭代器,并说明迭代器如何用于容器。其他高级问题可能会问你有关STL算法的经验,以及你是否对STL做过定制实现。
  探讨分布式对象
  因为分布式应用非常常见,可能会让你设计一个分布式系统,或者回答有关某种特定分布式技术的问题。
  要点 可靠性、可扩展性、集中性 分布式和网络式计算和区别
  串行化和RPC的概念
  如果你声称通晓CORBA或XML,就必须有所准备
  常见问题
  许多技术简历中都充斥着大量的缩写诩。如果在你的简历中列了一项诸如XML的技术,你的准老板并不能知道你的水平如何。除非你具体指出"基本XML技能"或"XML专家",针对你对自己的评价,可能会问你一些问题来确定你的评价是否属实。具体地,对XML来说,可能会让你定义诸如模式(schema)等术语,或者要求给出一个应用于给定XML文档的模式。
  由于XML如此流行,本书作者之一就曾经在面试时为应聘者提供了一个简单的XML文档。要求应聘人员指出所有属性、所有元素,以及所有文本节点。这让应聘都有些为难,不过这能有效地证明这个人是否用过XML,或者只是知道它是一种类HTML的语法。
  结合技术和框架
  Everything maybe important。
  应用设计模式
  由于设计模式在专业领域越来越流行(许多应聘人员甚至把这列为他们的一项技能),所以你很有可能遇到一位面试人员要求你解释某种模式,给出某个模式的用例,或者实现一个模式。
  要点 模式的基本思想是作为一个可重用的面向对象设计概念
  你在本书中读到的模式以及在工作中乃至的其他模式
  要知道成百上千的模式句子往往有冲突,所以你和面试人员可能使用不同的词表述同一个东西。
  常见问题
  回答有关设计模式的问题通常就像公园散步,除非面试人员希望你了解每一种已知模式的细节。幸运的是,大多数欣赏设计模式的程序员都只是想与你讨论,了解你的观点而已。毕竟,从书上或网上查找在关概念而不是自己死记硬背,这本身也是一个好模式!

猜你喜欢

转载自qwp57qwp.iteye.com/blog/1361886