Como passar em uma entrevista de C++: análise das principais perguntas com exemplos
A entrevista para a posição de desenvolvedor C++ é um teste não apenas de sintaxe, mas também de compreensão profunda de como funcionam a memória, o compilador e a biblioteca padrão. Neste artigo, analisaremos as perguntas mais frequentes em entrevistas nos anos de 2024-2025. Você aprenderá não apenas as respostas corretas, mas também verá exemplos de código que o ajudarão a passar com confiança na entrevista técnica.
1. Funções virtuais e polimorfismo
Isso é clássico. Os entrevistadores querem ter certeza de que você entende a diferença entre ligação estática e dinâmica, bem como o mecanismo de funcionamento da vtable (tabela de funções virtuais).
Pergunta: O que acontece se uma função virtual for chamada a partir de um construtor ou destrutor?
Resposta: A chamada de uma função virtual a partir do construtor da classe base não será polimórfica. No momento da chamada do construtor da classe base, o objeto da classe derivada ainda não foi criado, portanto, a versão da função da classe base será chamada. Da mesma forma para o destrutor — após a chamada do destrutor da classe derivada, o objeto é "rebaixado" para a classe base.
#include <iostream>
class Base {public: Base() { print(); } // Chamada de função virtual no construtor 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; // Saída: Base (do construtor de Base) // Derived (do construtor de Derived) return 0;}2. Smart Pointers
Nenhuma entrevista moderna escapa deste tópico. Os smart pointers são a base do RAII e do gerenciamento de recursos em C++.
Pergunta: Qual é a diferença entre std::unique_ptr, std::shared_ptr e std::weak_ptr? Quando usar cada um?
Resposta:
- unique_ptr — posse exclusiva. Não é copiado, apenas movido. Ideal para recursos que devem ser liberados ao sair do escopo.
- shared_ptr — posse compartilhada. Usa contagem de referências. Exclui o objeto quando a contagem chega a zero.
- weak_ptr — "observador" para shared_ptr. Não aumenta a contagem de referências. Usado para prevenir dependências cíclicas.
#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; // Contagem de referências = 2 // weak_ptr std::weak_ptr<Resource> wptr = sptr1; // Não aumenta a contagem if (auto locked = wptr.lock()) { std::cout << "Resource is still alive"; } return 0;}3. Move-semantics e rvalue references
Move-semantics é um dos principais recursos do C++11. Na entrevista, podem pedir para você escrever um move constructor ou explicar o que é uma forwarding reference.
Pergunta: O que é move-semantics e para que serve? Dê um exemplo de quando ela acelera o código.
Resposta: Move-semantics permite transferir a posse de recursos (por exemplo, memória dinâmica) sem copiá-los. Em vez de uma cópia profunda, nós "movemos" os ponteiros, zerando o objeto original. Isso é criticamente importante para o desempenho ao trabalhar com grandes containers.