Cómo aprobar una entrevista de C++: preguntas principales de la A a la Z
La entrevista para un puesto de desarrollador C++ es una prueba no solo del conocimiento de la sintaxis, sino también de la comprensión profunda del funcionamiento del compilador, la gestión de la memoria y las particularidades de la programación orientada a objetos. En este artículo, hemos analizado las preguntas principales de la A a la Z que se hacen con más frecuencia en las entrevistas. El material será útil tanto para desarrolladores junior como para aquellos que se preparan para un nivel middle.
1. Fundamentos de sintaxis y tipos de datos
Empecemos con lo básico: preguntas que evalúan tu comprensión de los conceptos fundamentales de C++.
1.1. ¿Cuál es la diferencia entre una referencia y un puntero?
Esta es una pregunta clásica. Las diferencias principales son:
- Una referencia no puede ser
nullptr, un puntero sí puede. - Una referencia no se puede reasignar a otro objeto después de la inicialización.
- Un puntero admite aritmética, una referencia no.
int a = 5;int& ref = a; // referenciaint* ptr = &a; // puntero
ref = 10; // a = 10*ptr = 20; // a = 201.2. ¿Qué es const y cómo usarlo correctamente?
const en C++ se utiliza para proteger los datos de modificaciones. Es importante distinguir entre const antes del tipo y después de él:
const int* ptr— puntero a un entero constante (no se puede cambiar el valor en la dirección).int* const ptr— puntero constante a un entero (no se puede cambiar la dirección).
2. Programación Orientada a Objetos (POO)
Las preguntas sobre POO son una parte obligatoria de la entrevista de C++. Analicemos los temas clave.
2.1. Funciones virtuales y polimorfismo
Las funciones virtuales proporcionan enlace tardío (polimorfismo dinámico). Ejemplo:
class Base {public: virtual void show() { std::cout << "Base"; } virtual ~Base() = default;};
class Derived : public Base {public: void show() override { std::cout << "Derived"; }};
int main() { Base* b = new Derived(); b->show(); // Imprime "Derived" delete b;}Es importante recordar el destructor virtual: sin él, al eliminar un objeto a través de un puntero a la clase base, solo se llamará al destructor de la clase base, lo que provocará una fuga de memoria.
2.2. Funciones virtuales puras y clases abstractas
Una clase que contiene al menos una función virtual pura (= 0) se vuelve abstracta. No se puede crear una instancia de dicha clase, solo un heredero con la implementación de todos los métodos virtuales puros.
2.3. ¿Qué son vtable y vptr?
Para implementar el polimorfismo, el compilador crea una tabla virtual (vtable) para cada clase con funciones virtuales. Cada objeto contiene un puntero oculto (vptr) a esta tabla. La llamada a una función virtual se realiza a través de una indirección mediante vptr, lo que añade una pequeña sobrecarga.
3. Gestión de memoria y punteros inteligentes
C++ proporciona al desarrollador un control total sobre la memoria, lo que requiere especial cuidado.
3.1. Diferencia entre new/delete y malloc/free
mallocasigna memoria, pero no llama al constructor.freelibera memoria sin llamar al destructor.newasigna memoria y llama al constructor.deletellama al destructor y libera la memoria.
3.2. Punteros inteligentes: unique_ptr, shared_ptr, weak_ptr
Los punteros inteligentes gestionan automáticamente el tiempo de vida de un objeto. Puntos clave:
std::unique_ptr— propiedad exclusiva, no se puede copiar, solo mover.std::shared_ptr— propiedad compartida mediante un contador de referencias.std::weak_ptr— no incrementa el contador de referencias, y