Como passar em uma entrevista de C++: principais perguntas com exemplos de código
A entrevista de C++ é um dos testes mais difíceis para um desenvolvedor. Esta linguagem combina o poder da programação de baixo nível com paradigmas modernos de OOP e templates. Para passar na entrevista com sucesso, você precisa não apenas conhecer a sintaxe, mas também entender como funcionam a memória, o compilador e a biblioteca padrão. Neste artigo, vamos analisar as 10 principais perguntas mais frequentes em entrevistas de C++, com respostas detalhadas e exemplos de código.
1. O que é RAII e para que serve?
RAII (Resource Acquisition Is Initialization) é um dos idiomas-chave do C++. A ideia é simples: um recurso (memória, arquivo, mutex) é adquirido no construtor do objeto e liberado no destrutor. Isso garante uma limpeza correta mesmo em caso de exceções.
Exemplo de código incorreto (sem RAII):
void process() { int* ptr = new int(42); // ... código que pode lançar uma exceção delete ptr; // vazamento se a exceção ocorrer antes do delete}Exemplo com RAII (usando std::unique_ptr):
#include <memory>
void process() { std::unique_ptr<int> ptr = std::make_unique<int>(42); // ... código com exceções // ptr será deletado automaticamente ao sair do escopo}Por que isso é perguntado: RAII é a base para o gerenciamento seguro de recursos em C++. Sem ele, é impossível escrever código confiável.
2. Qual a diferença entre uma função virtual e uma função virtual pura?
Uma função virtual (virtual) pode ser sobrescrita em uma classe derivada, mas possui uma implementação na classe base. Uma função virtual pura (= 0) não possui implementação na classe base e torna a classe abstrata — não é possível criar um objeto dessa classe.
Exemplo:
class Base {public: virtual void foo() { std::cout << "Base foo"; } // virtual virtual void bar() = 0; // virtual pura};
class Derived : public Base {public: void foo() override { std::cout << "Derived foo"; } void bar() override { std::cout << "Derived bar"; }};Pergunta adicional: Como funciona a vtable? O compilador cria uma tabela de funções virtuais para cada classe com métodos virtuais. Cada objeto contém um ponteiro para esta tabela (vptr). Ao chamar uma função virtual, ocorre um despacho dinâmico através da vtable.
3. Quais são os smart pointers em C++ e quando usá-los?
Em C++11, surgiram três tipos de smart pointers:
- std::unique_ptr — propriedade exclusiva. Não pode ser copiado, apenas movido. Ideal para recursos com um único dono.
- std::shared_ptr — propriedade compartilhada. Usa contagem de referências. Adequado quando vários objetos precisam possuir o mesmo recurso.
- std::weak_ptr — não possui o recurso, mas pode observar um shared_ptr. Necessário para quebrar referências cíclicas.
Exemplo de uso do unique_ptr:
#include <memory>
class MyClass { /* ... */ };
void example() { auto ptr = std::make_unique<MyClass>(); // auto ptr2 = ptr; // Erro! Não pode copiar auto ptr3 = std::move(ptr); // OK, movimento}Exemplo de shared_ptr e weak_ptr para prevenir referências cíclicas:
struct Node { std::shared_ptr<Node> next; std::weak_ptr<Node> prev; // weak_ptr para evitar ciclo};4. O que é move-semantics e std::move?
Move-semantics permite "mover" recursos de um objeto para outro em vez de copiá-los. Isso é especialmente útil para objetos temporários ou quando a cópia é cara (por exemplo, std::string ou