So bestehst du das C++-Vorstellungsgespräch: Top-Fragen mit Codebeispielen
Das C++-Vorstellungsgespräch ist eine der schwierigsten Prüfungen für einen Entwickler. Diese Sprache vereint die Leistungsfähigkeit der Low-Level-Programmierung mit modernen OOP-Paradigmen und Templates. Um das Interview erfolgreich zu bestehen, reicht es nicht aus, nur die Syntax zu kennen; man muss verstehen, wie Speicher, Compiler und die Standardbibliothek funktionieren. In diesem Artikel analysieren wir die Top-10-Fragen, die am häufigsten in C++-Vorstellungsgesprächen gestellt werden, mit detaillierten Antworten und Codebeispielen.
1. Was ist RAII und wozu wird es benötigt?
RAII (Resource Acquisition Is Initialization) ist eine der Schlüsselidiome von C++. Der Kern ist einfach: Eine Ressource (Speicher, Datei, Mutex) wird im Konstruktor eines Objekts erfasst und im Destruktor freigegeben. Dies garantiert eine korrekte Bereinigung selbst bei Ausnahmen.
Beispiel für falschen Code (ohne RAII):
void process() { int* ptr = new int(42); // ... Code, der eine Ausnahme auslösen könnte delete ptr; // Speicherleck, wenn die Ausnahme vor delete auftritt}Beispiel mit RAII (Verwendung von std::unique_ptr):
#include <memory>
void process() { std::unique_ptr<int> ptr = std::make_unique<int>(42); // ... Code mit Ausnahmen // ptr wird automatisch gelöscht, wenn der Gültigkeitsbereich verlassen wird}Warum wird dies gefragt: RAII ist die Grundlage für sicheres Ressourcenmanagement in C++. Ohne ihn ist es unmöglich, zuverlässigen Code zu schreiben.
2. Was ist der Unterschied zwischen einer virtuellen Funktion und einer rein virtuellen Funktion?
Eine virtuelle Funktion (virtual) kann in einer abgeleiteten Klasse überschrieben werden, hat aber eine Implementierung in der Basisklasse. Eine rein virtuelle Funktion (= 0) hat keine Implementierung in der Basisklasse und macht die Klasse abstrakt – es kann kein Objekt einer solchen Klasse erstellt werden.
Beispiel:
class Base {public: virtual void foo() { std::cout << "Base foo"; } // virtuell virtual void bar() = 0; // rein virtuell};
class Derived : public Base {public: void foo() override { std::cout << "Derived foo"; } void bar() override { std::cout << "Derived bar"; }};Zusatzfrage: Wie funktioniert vtable? Der Compiler erstellt für jede Klasse mit virtuellen Methoden eine Tabelle virtueller Funktionen. Jedes Objekt enthält einen Zeiger auf diese Tabelle (vptr). Beim Aufruf einer virtuellen Funktion erfolgt die dynamische Dispatch über die vtable.
3. Welche Smart Pointer gibt es in C++ und wann werden sie verwendet?
In C++11 kamen drei Arten von Smart Pointern hinzu:
- std::unique_ptr — exklusiver Besitz. Kann nicht kopiert, nur verschoben werden. Ideal für Ressourcen mit einem einzigen Besitzer.
- std::shared_ptr — geteilter Besitz. Verwendet einen Referenzzähler. Geeignet, wenn mehrere Objekte eine Ressource besitzen sollen.
- std::weak_ptr — besitzt die Ressource nicht, kann aber den shared_ptr beobachten. Wird benötigt, um zyklische Referenzen zu unterbrechen.
Beispiel für die Verwendung von unique_ptr:
#include <memory>
class MyClass { /* ... */ };
void example() { auto ptr = std::make_unique<MyClass>(); // auto ptr2 = ptr; // Fehler! Kann nicht kopiert werden auto ptr3 = std::move(ptr); // OK, Verschiebung}Beispiel für shared_ptr und weak_ptr zur Vermeidung zyklischer Referenzen:
struct Node { std::shared_ptr<Node> next; std::weak_ptr<Node> prev; // weak_ptr, um einen Zyklus zu vermeiden};4. Was ist Move-Semantik und std::move?
Move-Semantik ermöglicht es, Ressourcen von einem Objekt in ein anderes zu „verschieben", anstatt sie zu kopieren. Dies ist besonders nützlich für temporäre Objekte oder wenn das Kopieren teuer ist (z. B. std::string oder