Was ist die beste C ++ - Interviewfrage? [geschlossen]


28

Wenn Sie einem C ++ - Programmierer eine Frage stellen könnten, um seine C ++ - Fähigkeiten zu messen, welche wäre das?

Die Frage, die ich für die beste halte, lautet: Können Sie "delete this" nennen? innerhalb einer Mitgliedsfunktion? (Ich habe dies als Link eingefügt, damit du es dir zuerst überlegen kannst. Dann gehe zu The Best C ++ Interview Question - Ever!, Um die richtige Antwort zu finden.)

Ich frage das nicht, weil ich erwarte, dass die meisten Leute die Antwort wissen. Wenn sie das taten, wäre es keine so nützliche Frage. Ich frage, ob und wie sie es schaffen, die richtige Antwort zu finden.

Antworten:


8

Ich würde sie nach dem Grund fragen, warum die virtuelle Member-Funktion nicht mit Template in C ++ verwendet werden kann. Natürlich gibt es nur wenige Menschen, die die Frage tatsächlich sofort beantworten können. Wenn ein Befragter jedoch die Kernmechanismen von C ++ richtig versteht (wie Vorlagen in C ++ funktionieren, wie virtuelle Funktionen implementiert sind, wie Compiler und Linker eine ausführbare Datei aus Quellcode generieren usw.), erhalten Sie möglicherweise eine Antwort mit entsprechenden schrittweisen Anweisungen. Schritt führende Fragen.

Hinzugefügt: Die Funktion "Virtuelles Mitglied einer Vorlage" in dieser Antwort bedeutet, dass es sich bei der Funktion "Vorlage" um die Funktion "Virtuelles Mitglied" einer bestimmten Klasse handelt und nicht um eine reguläre Elementfunktion in der Vorlagenklasse. Entschuldigung für die Verwirrung :(


3
@summerlight: Ich mische Funktionen und Vorlagen für virtuelle Mitglieder und bisher ist nichts Schlimmes passiert ... Ich fürchte, ich habe nicht verstanden, worauf du hinaus willst. Möchtest du mich aufklären :)?
Matthieu M.

2
Diese Antwort ist fast aber nicht ganz richtig. Sie können keine Funktionen für virtuelle Vorlagenmitglieder haben, aber Sie können Funktionen für virtuelle Mitglieder einer Vorlagenklasse haben.
14.

1
@summerlight: ah habs! Amüsante Frage ja, erscheint oft;)
Matthieu M.

2
@nikie: Dies ist eine virtuelle Member-Funktion in der Template-Klasse - keine virtuelle Template-Member-Funktion wie template <typename T> virtual void doSomethingWithGenericTypeT (T arg);
Sommerlicht

2
@summerlight: Du hättest dieses Beispiel in deinen Beitrag aufnehmen sollen. Ich hatte bis jetzt keine Ahnung, was du meinst. Gute Frage, jetzt, wo ich es verstehe
;-)

57

Die beste C ++ - Interviewfrage wäre ein Programmierproblem, keine Quizfrage.


Einverstanden. Fragen Sie nicht nach der Syntax, die bei Google nachgeschlagen werden kann. Lassen Sie stattdessen den Kandidaten eine einfache (wenn auch nicht triviale) Funktion schreiben, vorzugsweise etwas, das Sie an einer Stelle in Ihren eigenen Code geschrieben haben.
Chrisaycock

4
Selbst etwas so Einfaches wie „eine Funktion schreiben , eine Zeichenfolge zu umkehren“ können Sie eine Menge über einen Experten Programmierer sagen: tun sie verwenden CString, char*, std::stringusw .; geben sie einen neuen String zurück oder kehren ihn um? Durchlaufen sie die Zeichen manuell oder rufen sie eine Bibliotheksfunktion auf? Und wenn sie etwas Einfaches wie das Umkehren einer Saite nicht können, sagt das natürlich auch viel über sie aus! Es gibt auch viele Anschlussfragen, wie funktioniert es mit Unicode, funktioniert es mit UTF-8 usw.
Gabe

16
@Ernelli: C ++ ist nie wirklich gestartet? Ernst?
Steven Evers

1
@Gabe - guter Punkt. Zum Beispiel wäre eine In-Place-Umkehrung einer Vorlage mit einem Richtlinienparameter entweder nicht sehr allgemein oder (wahrscheinlich eher die Richtlinie als die Funktion) ziemlich komplex, wenn es um Zeichenfolgen mit variablen Bytes pro Zeichen geht. Ich weiß nicht, ob es keine vorzeitige Optimierung gibt (erstellen Sie eine neue Zeichenfolge, weil es einfacher ist, allgemein zu sein) oder Agilität (kümmern Sie sich nicht um diesen Fall, bis es passiert, und die In-Place-Umkehrung ist nicht schwieriger, vielleicht ein bisschen einfacher, denn Zeichenketten mit fester Breite würden gewinnen.
Steve314

1
@Ernelli - du vergisst wchar_t und std :: wstring und sie bedeuten verschiedene Dinge unter Windows / Unix
Martin Beckett

32

Ich würde sie fragen, was sie an C ++ 0x mögen. Daraus könnte ich sie in verschiedene Stereotype "gruppieren":

  • Super alte Schule, verwendet C ++ - Compiler, um C-Code zu kompilieren
  • Die alte Schule, die Angst vor STL hat (oder keinen Grund dazu sieht), hat mit den Änderungen nicht Schritt gehalten
  • liebt Lambdas, liebt STL, die schneller von Rvalue - Referenzen wird, großen RAII - Fan, heiß, shared_ptr, unique_ptr usw. zu verwenden
  • ist bitter, weil der gesamte in den letzten Jahren geschriebene Boost-Code angepasst werden muss, um C ++ 0x-Entsprechungen zu verwenden
  • verrückter Template-Metaprogrammierer, der meinen Kopf explodieren lässt, während er eine relativ kurze Frage beantwortet

Es besteht die Möglichkeit, dass einige dieser Eimer perfekt für Sie sind und andere "Danke, dass Sie hereingekommen sind". Als eine Frage, die Ihnen schnell viele Informationen liefert, ist dies mein Gewinner.


1
+1 für eine gute Leitfrage, die zu vielen Diskussionen rund um das Thema anregt.
Gary Rowe

8
Sie haben die Kategorie der Leute vergessen, die keine Ahnung haben, was C ++ 0x ist. Ich denke, das wäre eher eine Antwort und würde zu den ersten beiden Typen passen.
Fast Fish

1
@ Fast Fish, ja, Leute, die wie C ++ 0-whatnow sind? wird in der Regel eine der ersten beiden Kategorien sein, und in der Regel wird dies in ihrer Antwort beleuchten.
Kate Gregory

28

Ich bin etwas amüsiert, warum "kannst du das löschen?" wird als interessante Frage angesehen. Jeder, der COM-Code in C ++ geschrieben hat, weiß, dass das allererste, was Sie am ersten Tag der grundlegenden COM-Programmierung lernen, die korrekte Verwendung von "delete this" ist. Ich nehme an, es könnte nützlich sein zu bestimmen, ob beispielsweise jemand in seinem Lebenslauf über das Schreiben von COM-Programmen lügt, aber als allgemeine C ++ - Frage, wenn jemand sie nicht sofort beantworten kann, werden sie nicht gut passen für mein team.

Wenn es Ihr Ziel ist, eine Frage zu entwickeln, die die C ++ - Fähigkeiten misst, dann ist die Auswahl einer Frage der falsche Weg. Dreh es um. Die richtige Frage ist:

Wie gut sind Sie als C ++ - Programmierer auf einer Skala von eins bis zehn?

Dies ist nicht die Frage, mit der Sie die gewünschte Antwort erhalten. Jeder sagt "acht", egal. Die Frage, mit der Sie die gewünschte Antwort erhalten, lautet:

OK, also bist du eine Acht. Was ist ein Problembereich, mit dem eine Sieben Ihrer Meinung nach nur schwer arbeiten kann?

Und boom , jetzt hast du sie. Wenn der Kandidat der Meinung ist, dass "etwas mit Rekursion zu tun hat" oder "wann ein virtueller Destruktor verwendet werden muss" die Art von Dingen ist, mit denen eine Sieben Schwierigkeiten hat, dann wissen Sie, dass sie ein wenig über Rekursion oder Destruktoren oder was auch immer wissen und dass ihr Wissen nicht viel weiter geht.

Das sollte Ihnen eine viel bessere Kalibrierung ermöglichen, als wenn Sie sich eine Quizfrage stellen. Wenn Sie mich zwingen würden, eine gute Frage zu einem Faktum über C ++ zu stellen, würde ich wahrscheinlich fragen: "Wie würden Sie den semantischen Analysator und den Codegenerator für den Teil eines C ++ - Compilers entwerfen, der sich mit virtuellen Methoden befasst? in einem Basisklassen-Destruktor aufgerufen? " Sie sollten Fragen stellen, die mit echten Dingen zu tun haben, an denen Sie arbeiten und an denen der Kandidat wahrscheinlich arbeitet. Das ist ein Problem, an dem ich einmal arbeiten musste, und ich denke, es würde einen ziemlich guten Einblick geben, wie eine Person semantische Analysatoren und Codegeneratoren entwirft und wie sie C ++ kennt.


3
Ich beginne mit diesem: OK, du bist also eine Acht. Was ist ein Problembereich, mit dem eine Sieben Ihrer Meinung nach nur schwer arbeiten kann?
David Thielen

10
Eine weitere gute Frage hier: Mit welcher Neun hätten Sie Probleme?
David Thornley

Das ist so genial, dass es unglaublich ist.
UpAndAdam

14

Aus Spaß hatte ich C ++ - Programmierer, die sich mit diesem kleinen Baby beschäftigten:

Warum läuft dies in eine Endlosschleife (und ja, es ist richtig geschrieben)?

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

Es ist verblüffend, wie viele sich in die Irre führen. Natürlich kann ich es nicht mehr benutzen, nachdem es auf Stack Overflow erschienen ist . Mutter ... murmeln ...

(Um die richtige Antwort zu erhalten, lesen Sie das Geständnis und auf jeden Fall die Kommentare)

Bonusfrage hinzugefügt

Es gibt den absoluten Klassiker FizzBuzz (wie im mittlerweile berühmten Coding Horror-Artikel beschrieben ). Ich habe es selbst noch nie in einem Interview verwendet, aber nachdem ich es eines Mittags im Entwicklerteam herumgeschmissen hatte, waren die Ergebnisse ... ähm ... überraschend genau.

Bekenntnis

Ich war über die Standardantwort "x ++ gibt den ursprünglichen Wert zurück" auf dem Laufenden. Die richtige Antwort ist jedoch, dass das Verhalten aufgrund von Sequenzpunkten undefiniert ist. Niemand hat jemals Sequenzpunkte erwähnt, solange ich diese verwendet habe, bis ich sie hier gepostet habe.

Ich bin gebildet worden und möchte aufrichtig allen danken, die sich die Zeit genommen haben, Kommentare abzugeben.


1
Gary Rowe: Während ich dieses Beispiel liebe (das erste Mal, dass ich es gesehen habe). Es macht mich traurig, dass die Leute das nicht so schnell sehen, geschweige denn nicht wissen.
Orbling

2
Als ich bei Microsoft war, begann ich, Bewerber zu bitten, einen Eintrag in eine verknüpfte Liste zu machen. Warum? Weil ungefähr 80% es nicht konnten. Erstaunlich ...
David Thielen

43
Dies ist nicht unbedingt eine Endlosschleife. Sie rufen hier undefiniertes Verhalten auf (x wird zweimal ohne dazwischenliegenden Sequenzpunkt geändert). Und in der Tat, mit meinem speziellen Compiler gcc (Debian 4.3.2-1.1) 4.3.2 auf meinem speziellen Bogen (x86) es nicht beenden.
Logan Capaldo

2
@Logan +1 für die Erwähnung von Sequenzpunkten. Sie würden sicher ein zweites Interview bekommen ;-)
Gary Rowe

4
Dies ist eine wirklich gute Interviewfrage, da sie dem Kandidaten sagt, ob es sich lohnt, für ein weiteres Interview zurückzukehren ;-). Wenn das Interview wirklich denkt, dass der Code zu einer Endlosschleife führt (und der Interviewer technisch kompetent sein soll), kann der Kandidat der "Gelegenheit" sicher einen Fehlschlag geben.
CB Bailey

8

Das erste, was zu fragen ist, ist eine einfache Frage zu Zeigern. Ich war erstaunt zu sehen, wie viele Leute, die behaupten, C ++ oder, noch schlimmer, C zu kennen, nicht in der Lage sind, darauf zu antworten. Dann würde ich eine einfache Frage zu virtuellen Funktionen stellen. Diese Kombination sagt Ihnen sehr schnell, ob die Person tatsächlich C ++ kennt oder nicht.


4
Hängt von ihrem Hintergrund ab, habe nie jemanden mit Hardware-Hintergrund getroffen, der Zeiger nicht verstand, aber einige, die nicht wirklich Kapselung oder Polymorphismus bekamen
jk.

7

Das hängt sehr davon ab, welche Art von C ++ in Ihrem Unternehmen geschrieben wird. (Als ich C ++ - Programmierer einstellen musste, habe ich nie danach gefragt delete, weil ich sie nach Techniken gefragt habe, die es vermeiden sollen, dass sie zusammen schreiben müssen delete.)

Idealerweise möchten Sie Mitarbeiter einstellen, die Code schreiben, der über dem Niveau Ihres Teams liegt, aber nicht zu hoch darüber liegt, es sei denn, Sie möchten dies mit dem Training des Teams kombinieren, um es auf ein höheres Niveau zu bringen.



6

Ich glaube, ich würde sie fragen, was sie sonst noch wissen, oder ihnen eher eine Frage zu etwas ganz anderem stellen.

Viel zu viele C ++ - Programmierer, die wenig Erfahrung mit anderen Sprachen haben. Schmale Erfahrung ist normalerweise einschränkend.


6

Die beste Frage für einen großartigen C ++ - Entwickler lautet: "Nennen Sie mir die Gründe, warum wir C ++ NICHT verwenden sollten ?"


4

Ich glaube nicht, dass es eine beste C ++ - Frage gibt. C ++ ist eine so große Sprache, und mit C ++ 0X ist sie gewachsen, dass Sie in einer bestimmten Unterdomäne der Sprache stark sein können und nicht wenig über einen anderen Teil der Sprache. Bei einer One-Shot-Frage wird nur ein kleiner Teil der Sprache von jemandem beherrscht, und es besteht die Gefahr, dass die Kenntnis anderer Aspekte der Sprache von jemandem übersehen wird.



3

Meine Lieblingsfrage ist einfach:

a) Hast du mit C angefangen und dann zu C ++ gewechselt?

b) Wenn ja, was waren dann die ersten Dinge, die Sie gelernt haben, anders zu machen?

Diese Antwort gibt mir normalerweise einen Überblick darüber, wie sich der Programmierer C ++ nähert und wie er OOP und C ++ im Allgemeinen versteht.

Es gibt hier keine "Richtige" oder "Falsche" Antwort, aber normalerweise ist es eine großartige Möglichkeit, einen Eindruck davon zu bekommen, woher der Kandidat kommt.


1

Ich würde der Person tatsächlich ein Stück Code aus einer anderen Programmiersprache präsentieren, die objektorientiert und vorzugsweise nicht auf der Liste der Sprachen steht, die sie kennt. Der Code sollte eine einfache Aufgabe darstellen, die in dieser Sprache ausgeführt wird.

Dabei geht es nicht darum, ihre Kenntnisse in C ++ zu bestimmen, sondern herauszufinden, wie gut sie die Programmierung verstehen. Wenn Sie die grundlegenden Konzepte hinter der Programmierung verstehen, können Sie Probleme lösen.


1

Wie Sie virtuelle Funktionen in C ++ implementieren, erklären Sie ein reales Szenario.


1

Im Moment würde ich sagen: "Wie würden Sie vorgehen, um einen Verschiebungskonstruktor für einen Container zu implementieren?"

Mein Grundgedanke ist, dass die Antwort des Kandidaten angibt, ob der betreffende Entwickler aktiv Kenntnisse über seine Sprache anstrebt oder sich nur an die ihm bekannten Tricks hält, da Verschiebungskonstruktoren ein Merkmal des nächsten und nicht des aktuellen Standards sind.


1

Ich denke, ich würde ihre Meinung über das Design von sagen wir, fragen std::string. Ich würde sie auch fragen , ob sie andere Konstruktionen verwendet haben (zB MFC / ATL CString, wxStringetc.) und vorausgesetzt , sie haben, fragen sie die Entwürfe zu vergleichen und gegenüberzustellen .

Strings sind weit genug verbreitet, sodass fast jeder, der echte Erfahrung mit C ++ hat, mindestens eines oder zwei der oben genannten verwenden sollte. Fast alle Entwürfe enthalten Kompromisse zwischen theoretischer Reinheit und praktischer Anwendung. Einige können wirklich gut funktionieren, aber nur, wenn sie genau so verwendet werden, wie sie beabsichtigt sind, während andere eine größere Vielseitigkeit gegen mögliche Ungeschicklichkeit eintauschen. Kurz gesagt, die fast jeder wirkliche Erfahrung sollten einige aussagekräftige Meinungen ihrer Entwürfe und diese Meinungen sollten Sie eine angemessene auszudrücken sagen Menge darüber , wie sie denken können, wie sie Code - Design, das Ausmaß , in dem sie Wert Pragmatismus gegenüber theoretischen Reinheit, und so weiter.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.