P
prepair.app
Interview starten →
EnglishУкраїнськаРусскийDeutsch
🔷

C++-Interviewfragen

C++-Interviews testen drei Dinge: ob du das Objektmodell verstehst, ob man dir den Umgang mit Speicher zutrauen kann und ob du weißt, was die Standardbibliothek wirklich kostet. Hier sind die am häufigsten gestellten Fragen, jeweils mit einer Musterantwort.

Junior · keine Erfahrung / unter 1 JahrMiddle · 2–4 Jahre ErfahrungSenior · 5+ Jahre Erfahrung

Worum es geht

Speicher, Pointer und RAII
OOP, virtuelle Funktionen und vtable
Move-Semantik und die Rule of Five
Templates und Metaprogrammierung
STL-Container und Komplexität
Nebenläufigkeit und Data Races

10 echte Fragen mit Antworten

Zu jeder Frage gibt es eine Musterantwort, mit der du deine eigene vergleichen kannst.

1

Was ist der Unterschied zwischen einem Pointer und einer Referenz?

Antwort

Eine Referenz muss bei ihrer Erzeugung gebunden werden und kann danach nie wieder umgebunden werden; ein Pointer kann null sein, neu zugewiesen werden und hat seine eigene Adresse sowie Pointer-Arithmetik. In der Praxis nimmt man eine Referenz, wenn das referenzierte Objekt zwingend existieren muss, und einen Pointer, wenn Abwesenheit ein gültiger Zustand ist. Eine Referenz ist kein eigenständiges Objekt – deshalb gibt es weder Referenzen auf Referenzen noch Arrays davon.

2

Was ist RAII?

Antwort

Resource Acquisition Is Initialization: Eine Ressource gehört einem Objekt, wird in dessen Konstruktor erworben und im Destruktor wieder freigegeben. Da Destruktoren auf jedem Ausstiegspfad laufen – auch wenn eine Exception den Stack abwickelt –, kann die Ressource nicht durch ein später hinzugefügtes frühes return leaken. Jeder Smart Pointer, jeder Lock Guard und jeder Filestream der Standardbibliothek basiert genau auf dieser Idee.

3

`unique_ptr`, `shared_ptr`, `weak_ptr` – wann verwendet man welchen?

Antwort

unique_ptr steht für alleinigen Besitz, wird gemoved statt kopiert und kostet nichts gegenüber einem rohen Pointer – er sollte der Standardfall sein. shared_ptr bedeutet geteilten Besitz mit einem atomaren Referenzzähler, was nicht kostenlos ist und oft dort eingesetzt wird, wo die Besitzfrage einfach nicht geklärt wurde. weak_ptr beobachtet einen shared_ptr, ohne ihn zu besitzen, und seine Hauptaufgabe ist es, Referenzzyklen zu durchbrechen, die sonst nie freigegeben würden.

4

Warum braucht eine Basisklasse einen virtuellen Destruktor?

Antwort

Weil das Löschen eines abgeleiteten Objekts über einen Basisklassen-Pointer ohne virtuellen Destruktor undefiniertes Verhalten ist – in der Praxis läuft der Destruktor der abgeleiteten Klasse dann nie und ihre Member leaken. Die Regel lautet: Ist eine Klasse dafür gedacht, dass von ihr geerbt und polymorph gelöscht wird, muss ihr Destruktor virtuell sein. Ist sie nicht als Basisklasse gedacht, braucht sie keinen, und ein zusätzlich hinzugefügter erzeugt eine vtable, die es sonst nicht gäbe.

5

Was sind `vptr` und `vtable`?

Antwort

Eine Klasse mit virtuellen Funktionen bekommt eine Tabelle von Funktionspointern – die vtable, eine pro Klasse –, und jedes Objekt dieser Klasse speichert einen versteckten Pointer darauf, den vptr. Ein virtueller Aufruf liest den vptr, indiziert die Tabelle und springt. Das macht das Objekt um einen Pointer größer und den Aufruf indirekt, und deshalb kann der Compiler nur devirtualisieren, wenn er den dynamischen Typ beweisen kann.

6

Was ist der Unterschied zwischen Stack und Heap?

Antwort

Der Stack wird durch simples Verschieben eines Pointers beim Betreten und Verlassen von Scopes allokiert und freigegeben, also schnell, zusammenhängend und cache-freundlich, aber begrenzt und an die Lebensdauer des Scopes gebunden. Der Heap wird auf Anfrage allokiert, hat keine eigenen Lebensdauerregeln und kostet einen echten Allocator-Aufruf plus das Risiko von Fragmentierung. Bevorzuge den Stack; auf den Heap gehst du, wenn die Größe unbekannt ist oder das Objekt den Scope überleben muss.

7

Was ist Move-Semantik und was macht `std::move`?

Antwort

Move-Semantik erlaubt es, eine Ressource zu übertragen statt sie zu kopieren – der Move-Konstruktor eines Vektors klaut den Buffer-Pointer, statt Elemente neu zu allokieren und zu kopieren. std::move selbst bewegt nichts: Es ist ein Cast zu einer Rvalue-Referenz, der das Objekt für einen Move infrage kommen lässt. Ob tatsächlich etwas gemoved wird, hängt davon ab, ob der Typ einen Move-Konstruktor hat, und das Objekt, aus dem gemoved wurde, bleibt gültig, aber in einem unspezifizierten Zustand.

8

Was ist Undefined Behavior und warum ist es gefährlich?

Antwort

Verhalten, für das der Standard keine Anforderungen stellt – das Lesen über das Ende eines Arrays hinaus, das Dereferenzieren von null, Overflow bei signed Integern, die fehlerhafte Nutzung eines Objekts nach dem Move, ein Data Race. Gefährlich ist es genau deshalb, weil es oft funktionierend aussieht: Der Compiler darf annehmen, dass es nie passiert, und optimiert auf dieser Annahme – deshalb bricht derselbe Code nach einer scheinbar unabhängigen Änderung oder bei einer anderen Optimierungsstufe. Sanitizer sind das Mittel, um es zu finden.

9

Wann würdest du `std::vector` gegenüber `std::list` wählen?

Antwort

Fast immer. vector liegt zusammenhängend im Speicher, daher ist die Iteration cache-freundlich und lässt sich prefetchen, während list pro Element einem Pointer hinterherläuft und pro Knoten eine Allokation zahlt. list gewinnt nur, wenn du ständig in der Mitte einfügst oder splicest und dabei Iteratoren gültig halten musst – und selbst dann lohnt sich das Messen, weil auf moderner Hardware Lokalität meist die bessere Komplexitätsklasse schlägt.

10

Was ist ein Data Race und wie vermeidet man ihn?

Antwort

Zwei Threads greifen auf dieselbe Speicherstelle zu, mindestens einer schreibend, ohne Synchronisation zwischen ihnen – das ist undefiniertes Verhalten, nicht bloß ein falsches Ergebnis. Du vermeidest es, indem du veränderlichen Zustand nicht teilst, ihn mit einem Mutex schützt oder den Zugriff atomar machst. ThreadSanitizer findet die meisten davon, und das ist verlässlicher, als über einen Scheduling-Ablauf nachzudenken, den du nicht reproduzieren kannst.

🦎

Antworten lesen reicht nicht

Im echten Interview sprichst du unter Druck. Cam stellt genau diese Fragen, bewertet jede Antwort und zeigt dir genau, was du verbessern musst.

C++-Interview üben →
Kostenlos · 3 Interviews im Monat

Lesenswert

Alle Artikel →

Weitere Spezialisierungen

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP-Backend🦫Go-Backend🟢Node.js-Backend💎Ruby on Rails🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing