最好的C ++面试问题是什么?[关闭]


28

如果您可以问一个C ++程序员一个问题来衡量他们的C ++技能,那会是什么?

我认为最好的问题是:您可以称之为“删除此”吗?成员函数内部?(我将其作为链接,因此您可以首先考虑一下,然后转到“最佳C ++面试问题–永远!”以查看正确的答案。)

我不问这个问题是因为我希望大多数人都知道答案。如果他们这样做了,那么这将不是一个有用的问题。我要求看看他们是否可以按照自己的方式来获得正确答案,以及如何做到这一点。

Answers:


8

我想问问他们为什么虚拟成员函数不能与C ++中的模板一起使用的原因。当然,只有少数人可以立即真正回答问题。但是,如果受访者正确理解了C ++的核心机制(模板在C ++中的工作方式,虚拟函数的实现方式,编译器和链接器如何从源代码生成可执行文件等),则可以通过适当的逐步操作获得答案。提出主要问题。

已添加:此答案中的模板虚拟成员函数表示模板函数是某个类的虚拟成员函数,而不是模板类中的常规成员函数。抱歉让您感到困惑:(


3
@summerlight:我确实混合了虚拟成员函数和模板,到目前为止还没有发生什么坏事情……所以,我恐怕我不明白你在做什么。希望启发我:)?
Matthieu M. 2010年

2
这个答案几乎但不是很正确。您不能具有模板虚拟成员函数,但是可以具有模板类的虚拟成员函数。
catphive 2010年

1
@summerlight:知道了!是一个有趣的问题,经常弹出;)
Matthieu M.

2
@nikie:那是模板类中的虚拟成员函数-不是虚拟模板成员函数,例如template <typename T> virtual void doSomethingWithGenericTypeT(T arg);
summerlight

2
@summerlight:您应该在您的帖子中包含该示例。直到现在我都不知道你的意思。不过,这是一个好问题,因为我确实了解它;-)
nikie 2011年

57

最好的C ++面试问题将是编程问题,而不是测验问题。


同意 不要问可以在Google上查询的语法。取而代之的是,让应聘者编写一个简单的(尽管不是微不足道的)函数,最好是您一次用自己的代码编写的函数。
chrisaycock 2010年

4
即使是一些简单的“写一个函数来扭转一个字符串”可以告诉你很多有关专家程序员:他们使用CStringchar*std::string等; 他们返回新字符串还是原地反转?他们是手动循环遍历字符还是调用库函数。当然,如果他们不能做一些简单的事情,例如反转字符串,那也可以告诉您很多有关它们的信息!也有很多的后续问题,比如使用Unicode它的工作原理,它使用UTF-8等工作
加布

16
@Ernelli:C ++从未真正起飞吗?认真吗
史蒂文·埃弗斯

1
@Gabe-好点。例如,当涉及每个字符的可变字节字符串时,使用策略参数在模板中进行反向模板要么不是很通用,要么(可能是策略,而不是功能)非常复杂。我不知道没有过早的优化(创建一个新的字符串,因为它更容易通用)或敏捷性(在这种情况发生之前不要担心这种情况,就地反向转换并不困难,也许有点更容易,因为固定宽度字符字符串)将胜出。
Steve314 2011年

1
@Ernelli-您忘记了wchar_t和std :: wstring以及它们在Windows / Unix上的含义不同
Martin Beckett

32

我想问问他们对C ++ 0x的看法。由此,我可以将它们“分类”为各种刻板印象:

  • 超级老派,使用C ++编译器来编译C代码
  • 老派,害怕(或看不到)STL,没有跟上变化
  • 热爱lambda,热爱STL,从右值引用,更快的RAII粉丝,热衷于使用shared_ptr,unique_ptr等获得更快的速度
  • 这很痛苦,因为过去几年编写的所有增强代码都需要进行改编以使用C ++ 0x等效项
  • 疯狂的模板元编程器,回答一个相对简短的问题时,我的脑袋爆炸了

这些存储桶中有一些对您而言非常合适,而有些则是“感谢您的光临”。作为一个使您快速获取大量信息的问题,这是我的赢家。


1
+1是一个很好的引导性问题,可以鼓励围绕该主题进行大量讨论。
加里·罗

8
您忘记了不知道C ++ 0x是什么的人。我猜这将是一个更好的答案,并且适合前两种类型。
Fast Fish 2010年

1
@Fast Fish,是的,像C ++ 0-nownow的人?通常将是前两个类别之一,并且通常会在其答案中阐明这一点。
凯特·格雷戈里

28

我对为什么“可以删除它”感到困惑。被认为是一个有趣的问题。用C ++编写COM代码的任何人都知道,您在基本COM编程的第一天就学到的第一件事就是如何正确使用“删除此内容”。我想确定某个人是否正在躺在关于编写COM程序的履历表上可能很有用,但是作为一个常识性C ++问题,如果某人不能立即回答,那么他们就不太适合为我的团队。

无论如何,如果您的目标是提出一个衡量C ++技能的问题,那么选择一个问题是错误的方法。扭转局面。正确的问题是:

从1到10的规模,您是一名C ++程序员,您有多好?

这不是让您获得想要的答案的问题。所有人都说“八”。为您提供所需答案的问题是:

好,你八岁了。您认为七岁的孩子会遇到什么困难呢?

繁荣,现在您已经拥有了它们。如果应聘者认为“与递归有关”或“何时使用虚拟析构函数”是七岁以下儿童所无法承受的事情,那么您知道他们对递归或析构函数或其他知识了解得很少,并且他们的知识没有比这更深入的了。

与提出一些琐碎问题相比,这应该给您更好的校准。如果要强迫我提出一个有关C ++事实的好问题,我可能会问类似“您如何为处理虚拟方法的C ++编译器部分设计语义分析器和代码生成器”在基类析构函数中调用?” 您应该问一些与您从事的实际工作有关的问题,并且候选人可能会从事工作。这是我不得不处理的一个问题,我认为它可以很好地了解一个人如何设计语义分析器和代码生成器以及他们对C ++的了解。


3
我将开始使用这个:好的,你八岁了。您认为七岁的孩子会遇到什么困难呢?
大卫·蒂伦

10
这里还有一个很好的问题:您可能会遇到九个问题吗?
David Thornley

真是太棒了,太神奇了。
UpAndAdam13年

14

只是为了好玩,我让C ++程序员迷上了这个小宝贝:

为什么会遇到无限循环(是的,它的键入正确)?

int x=0;
while (x<3) {
  x = x++;
}

令人惊讶的是有多少人被绊倒了。我当然不能用了它在Stack Overflow上出现后就。咕......咕utter ...

(要获得正确的答案,请阅读自白,并务必阅读评论)

添加了奖金问题

有史以来最经典的FizzBu​​zz(如现在著名的《编码恐怖》文章所述))。我本人从未真正在面试中使用过它,但是在午餐时间将它扔给开发团队之后,结果是……嗯……令人惊讶地准确。

告白

我被标准的“ x ++返回原始值”响应所困扰。但是,正确的答案是由于序列点,行为是不确定的。在我使用此序列之前,没有人一直提到序列点。

我受过教育,并且我真的要感谢所有花时间发表评论的人。


1
加里·罗(Gary Rowe):虽然我喜欢那个例子(我第一次看过)。人们不能如此迅速地看到它真使我难过,更不用说不知道了。
Orbling 2010年

2
当我在Microsoft时,我开始要求申请人在链接列表中进行插入。为什么?因为大约80%的人做不到。很棒...
大卫·蒂伦

43
这不一定是无限循环。您在此处调用未定义的行为(x被修改了两次,没有中间的序列点)。实际上,使用我的特定编译器gcc(Debian 4.3.2-1.1)4.3.2在我的特定arch(x86)上确实会终止。
Logan Capaldo 2010年

2
@Logan +1表示序列点。您肯定会接受第二次采访;-)
Gary Rowe 2010年

4
这是一个非常好的面试问题,因为它告诉应聘者是否值得再进行一次面试;-)。如果面试确实认为该代码确实导致了无限循环(并且面试官应具有技术能力),则候选人可以放心地给“机会”一个机会。
CB Bailey 2010年

8

首先要问的是关于指针的简单问题。令我惊讶的是,有多少人声称知道C ++,甚至更糟的是,他们无法回答C ++。然后我会问一个关于虚函数的简单问题。这种组合可以非常快速地告诉您该人是否真正了解C ++。


4
取决于他们的背景,从来没有遇到过不了解指针但又没有真正了解封装或多态性
jk)

7

这很大程度上取决于您公司编写的C ++类型。(当我不得不雇用C ++程序员时,我从来没有询问过delete,因为我询问过他们避免delete完全编写的技术。)

理想情况下,您希望聘用的人员编写的代码要高于团队当前编写的代码,但不要高于团队当前编写的代码,除非您希望将其与培训团队相结合以使其达到更高的水平。



6

我相信我会问他们他们还知道什么,或者更有可能给他们一个完全不同的问题。

几乎没有其他语言经验的C ++编码人员。狭窄的经验通常是限制性的。


6

对于优秀的C ++开发人员而言,最好的问题是“告诉我为什么使用C ++ 的原因?”


4

我认为没有最佳的C ++问题。C ++是一门庞大的语言,并且随着C ++ 0X的发展,您在该语言的某个子域中会变得很强大,而对于该语言的另一部分则几乎一无所知。一个“单发”问题只会锻炼某人对一小部分语言的知识,并有可能忽略他或她对语言其他方面的知识。



3

我最喜欢问的一个简单问题是:

a)您是否从C开始然后切换到C ++?

b)如果是这样,那么您学到的与众不同的前几件事情是什么?

这个答案通常使我对程序员如何使用C ++以及他/她对OOP和C ++的总体了解有所了解。

这里没有“正确”或“错误”的答案,但通常这是一种了解候选人来自何处的好方法。


1

实际上,我会向该人展示一些来自另一种面向对象的编程语言的代码,最好不在他们所知道的语言列表上。该代码应代表使用该语言完成的简单任务。

这样做的目的不是要确定他们对C ++的了解,而是要了解他们对编程的理解程度。了解了编程背后的基本概念之后,就可以解决问题了。



1

此刻,我会说:“您将如何为容器实现move构造函数?”

我的理由是,由于移动构造函数是下一个标准的功能,而不是当前标准的功能,因此候选人的答案将表明所涉及的开发人员是积极地追求有关其语言的知识还是只是坚持自己所知道的技巧。


1

我想问一下他们对的设计的看法std::string。我还要问他们是否使用了其他设计(例如MFC / ATL CStringwxString等),并假设他们有,请他们比较和对比的设计。

字符串已被广泛使用,以至于几乎所有具有C ++实际使用经验的人都应该至少使用过上述一种或两种。几乎所有设计都在理论纯度和实际使用之间做出了一些折衷。有些功能确实可以很好地工作,但前提是必须完全按预期使用,而另一些功能则具有更大的通用性,可能会有些笨拙。简而言之,几乎任何有实际经验的人都应该能够对他们的设计表达一些有意义的意见,这些意见应该告诉您很多有关他们的想法,他们如何设计代码,他们重视实用主义与理论纯度的程度,等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.