Apuntadores y referencias en C++. Concepto de apuntador. Uso de *
para declarar variables de tipo apuntador. Operadores para manipular direcciones de memoria y apuntadores: &
, *
y ->
. Concepto de referencia. Uso de &
para declarar variables de tipo referencia. Paso de parámetros por referencia vs paso de parámetros por valor. Uso del apuntador this
dentro de un método.
Herencia y polimorfismo en C++. Concepto de herencia. Modificadores de acceso: public
, private
y protected
. Sobrecarga y sobreescritura de métodos. Métodos virtuales y virtuales puros. Concepto de polimorfismo. Clases abstractas y clases concretas. Diagramas de clases UML para representar herencia. Herencia vs composición. Concepto de upcasting y downcasting. Operadores static_cast
y dynamic_cast
.
Sobrecarga de operadores en C++. Conceptos generales de sobrecarga de operadores. Ejemplos representativos de cómo sobrecargar operadores específicos. Sobrecarga de operadores dentro y fuera de una clase.
Excepciones en C++. Concepto de excepción. Excepciones predefinidas en el encabezado <stdexcept>
: std::exception
, std::invalid_argument
y std::runtime_error
. El método what
de una excepción. Manejo de excepciones usando las instrucciones throw
, try
y catch
.
Pluma, lápiz, borrador, sacapuntas.
Acordeón personal de estudio con las siguientes características:
|
NOTA 1: Una vez iniciado el examen, no se permite compartir ningún artículo con alguien más.
NOTA 2: No está permitido usar teléfono celular, calculadora, tableta, computadora o cualquier otro dispositivo electrónico.
¿Qué imprime en la salida estándar el siguiente código de C++?
#include <iostream> void fun(int a, int &b) { a++; b++; } int main() { int x = 5; int y = 5; std::cout << x << " " << y << "\n"; fun(x, y); std::cout << x << " " << y << "\n"; return 0; }
¿Qué imprime en la salida estándar el siguiente código de C++?
#include <iostream> int main() { int i = 5; int &r = i; int *p = &i; i++; r++; (*p)++; std::cout << i << " " << r << " " << *p << "\n"; return 0; }
El siguiente código de C++ produce un error de compilación. Explica porqué e indica cómo se podría corregir.
#include <iostream> class A { public: virtual void m() = 0; }; class B : public A { public: }; int main() { B b; b.m(); return 0; }
¿Qué imprime en la salida estándar el siguiente código de C++?
#include <iostream> #include <vector> class Alpha { public: virtual void flimflam() { std::cout << "alpha\n"; } }; class Beta : public Alpha { public: void flimflam() override { std::cout << "beta\n"; } }; class Gamma : public Alpha { public: void bamboozle() { std::cout << "gamma\n"; } }; int main() { Alpha a; Gamma g; Beta b; std::vector<Alpha*> vec = {&a, &g, &b}; for (Alpha* p: vec) { p->flimflam(); Gamma* q = dynamic_cast<Gamma*>(p); if (q) { q->bamboozle(); } } return 0; }
Elabora el diagrama UML de la jerarquía de clases que aparecen en la pregunta anterior.
Escribe el código necesario para representar una jerarquía de clases en C++ como se describe a continuación.
Las clases deben ser: Animal
, Perro
y Gato
. La clase Perro
y Gato
deben extender de la clase Animal
.
La clase Animal
debe tener los siguientes dos atributos: nombre
(cadena de caracteres) y edad
(entero). Operaciones:
virtual void hacer_sonido() const
virtual void mostrar_informacion() const
La clase Perro
debe agregar el atributo raza
(cadena de caracteres). Operaciones:
hacer_sonido()
para imprimir el sonido característico del perro ("Guau").
mostrar_informacion()
para imprimir los datos específicos del perro.
La clase Gato
debe agregar el atributo color
(cadena de caracteres). Operaciones:
hacer_sonido()
para imprimir el sonido característico del perro ("Miau").
mostrar_informacion()
para imprimir los datos específicos del gato.
Tus clases deben poder funcionar con el siguiente código:
void demostrar_animal(const Animal& a) { a.mostrar_informacion(); a.hacer_sonido(); } int main() { Perro p("Firulais", 5, "Labrador"); Gato g("Michi", 3, "Negro"); demostrar_animal(p); std::cout << "\n"; demostrar_animal(g); return 0; }
Al correr el programa, esta debe ser su salida:
Perro: Nombre: Firulais Edad: 5 Raza: Labrador Guau Gato: Nombre: Michi Edad: 3 Color: Negro Miau
¿Qué imprime en la salida estándar el siguiente código de C++?
#include <iostream> #include <vector> class Delta { public: Delta(int x = 0) { _x = x; } int operator+() const { return _x + 1; } int operator+(const Delta &other) const { return (_x + other._x) * 2; } private: int _x; }; int main() { Delta d(3); int r = +d * (d + d); std::cout << r << "\n"; return 0; }
Explica para qué sirve el modificador de acceso private
al momento de declarar los miembros de una clase.
¿Qué imprime en la salida estándar el siguiente código de C++?
#include <iostream> #include <stdexcept> void collywobbles(int x) { std::cout << "a"; if (x % 2 == 1) { throw std::runtime_error("b"); } std::cout << "c"; throw 10; } void crapulence(int y) { try { std::cout << "d"; collywobbles(y + 1); std::cout << "e"; } catch (int) { std::cout << "f"; } std::cout << "g"; } int main() { try { std::cout << "h"; crapulence(1); std::cout << "i"; crapulence(2); std::cout << "j"; } catch (std::runtime_error e) { std::cout << e.what(); } std::cout << "k"; return 0; }
Usando un diagrama UML, explica la diferencia que existe entre herencia y composición.