Comment réussir un entretien C++ : analyse des questions les plus fréquentes avec exemples
Un entretien pour un poste de développeur C++ ne teste pas seulement la syntaxe, mais aussi une compréhension approfondie du fonctionnement de la mémoire, du compilateur et de la bibliothèque standard. Dans cet article, nous analyserons les questions les plus courantes posées lors des entretiens en 2024-2025. Vous n’apprendrez pas seulement les bonnes réponses, mais vous verrez aussi des exemples de code qui vous aideront à réussir votre entretien technique avec confiance.
1. Fonctions virtuelles et polymorphisme
C’est un classique. Les recruteurs veulent s’assurer que vous comprenez la différence entre la liaison statique et dynamique, ainsi que le mécanisme de la vtable (table des fonctions virtuelles).
Question : Que se passe-t-il si on appelle une fonction virtuelle depuis un constructeur ou un destructeur ?
Réponse : L’appel d’une fonction virtuelle depuis le constructeur de la classe de base ne sera pas polymorphe. Au moment de l’appel du constructeur de la classe de base, l’objet de la classe dérivée n’est pas encore créé, donc la version de la fonction de la classe de base sera appelée. De même pour le destructeur — après l’appel du destructeur de la classe dérivée, l’objet est "rétrogradé" vers la classe de base.
#include <iostream>
class Base {public: Base() { print(); } // Appel d'une fonction virtuelle dans le constructeur virtual void print() { std::cout << "Base"; } virtual ~Base() = default;};
class Derived : public Base {public: Derived() { print(); } void print() override { std::cout << "Derived"; }};
int main() { Derived d; // Affichage : Base (depuis le constructeur de Base) // Derived (depuis le constructeur de Derived) return 0;}2. Smart Pointers (pointeurs intelligents)
Aucun entretien moderne ne fait l’impasse sur ce sujet. Les smart pointers sont la base du RAII et de la gestion des ressources en C++.
Question : Quelle est la différence entre std::unique_ptr, std::shared_ptr et std::weak_ptr ? Quand utiliser chacun ?
Réponse :
- unique_ptr — propriété exclusive. Non copiable, uniquement déplaçable. Idéal pour les ressources qui doivent être libérées en sortant de la portée.
- shared_ptr — propriété partagée. Utilise un compteur de références. Supprime l’objet lorsque le compteur atteint zéro.
- weak_ptr — "observateur" pour shared_ptr. N’augmente pas le compteur de références. Utilisé pour éviter les dépendances cycliques.
#include <memory>#include <iostream>
class Resource {public: Resource() { std::cout << "Resource acquired"; } ~Resource() { std::cout << "Resource released"; }};
int main() { // unique_ptr std::unique_ptr<Resource> uptr = std::make_unique<Resource>(); // shared_ptr std::shared_ptr<Resource> sptr1 = std::make_shared<Resource>(); std::shared_ptr<Resource> sptr2 = sptr1; // Compteur de références = 2 // weak_ptr std::weak_ptr<Resource> wptr = sptr1; // N'augmente pas le compteur if (auto locked = wptr.lock()) { std::cout << "Resource is still alive"; } return 0;}3. Move-sémantique et références rvalue
La move-sémantique est l’une des fonctionnalités clés de C++11. Lors d’un entretien, on peut vous demander d’écrire un constructeur de déplacement ou d’expliquer ce qu’est une forwarding reference.
Question : Qu’est-ce que la move-sémantique et pourquoi est-elle nécessaire ? Donnez un exemple où elle accélère le code.
Réponse : La move-sémantique permet de transférer la propriété des ressources (par exemple, la mémoire dynamique) sans les copier. Au lieu d’une copie profonde, on "déplace" les pointeurs, en mettant à zéro l’objet source. C’est crucial pour les performances lors du travail avec de grands conteneurs.