Repaso: clase String
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 26 de 104.
Desafío
FácilVamos a crear una clase String completa que gestione su propio arreglo dinámico de caracteres y reúna todos los conceptos de constructores y destructores de este capítulo. Este es un ejercicio clásico que refleja cómo funciona internamente std::string.
Crearás dos archivos para organizar tu código:
String.h: Define tu claseStringsiguiendo la Regla de Cinco. Tu clase debe gestionar un punterochar*llamadodatay un miembrosize_t length. Implementa:- Un constructor predeterminado que cree una cadena vacía (asigna memoria para un solo carácter, el terminador nulo, y establece la longitud en 0). Imprime
"Default constructed" - Un constructor parametrizado que reciba un
const char*y copie la cadena C en memoria recién asignada. Imprime"Constructed: <text>" - Un constructor de copia que realice una copia profunda de otra String. Imprime
"Copied: <text>" - Un constructor de movimiento (marcado como
noexcept) que transfiera la propiedad. Imprime"Moved: <text>"usando el texto antes de anular el origen - Un destructor que libere la memoria de forma segura (comprueba si es null). Imprime
"Destroyed: <text>"(imprime"Destroyed: (empty)"si data es null o length es 0) - Un método
size()que devuelva la longitud - Un método
c_str()que devuelva el puntero a los caracteres (devuelve""si es null)
- Un constructor predeterminado que cree una cadena vacía (asigna memoria para un solo carácter, el terminador nulo, y establece la longitud en 0). Imprime
main.cpp: Muestra cómo funcionan juntos todos los constructores. Lee una cadena de texto de la entrada y luego:- Crea un
Stringllamados1usando el constructor predeterminado - Crea un
Stringllamados2con el texto de entrada - Crea un
Stringllamados3copiandos2 - Crea un
Stringllamados4moviendo el contenido des2 - Imprime
"--- Status ---" - Para cada cadena (de s1 a s4), imprime
"s<n>: \"<text>\" (length: <len>)"
- Crea un
Usa listas de inicialización en todos los constructores para mejorar la eficiencia. Después del movimiento, s2 debe estar vacía y tener una longitud de 0, mientras que s4 debe contener el texto original. Los mensajes del destructor al final mostrarán que los cuatro objetos se liberan en orden inverso al de su creación.
Incluye <cstring> para strlen y strcpy, y <utility> para std::move(). No olvides las protecciones de inclusión en tu archivo de encabezado.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Crea String s1 usando el constructor predeterminado
// TODO: Crea String s2 con el texto de entrada
// TODO: Crea String s3 copiando s2
// TODO: Crea String s4 moviendo s2 (usa std::move)
// Imprime la cabecera de estado
cout << "--- Status ---" << endl;
// TODO: Imprime el estado de cada cadena desde s1 hasta s4
// Formato: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosCompilación y construcción en C++Archivos de cabecera y archivos fuenteEspacios de nombres y ámbitoIntroducción a la POO en C++Clases y objetosEl puntero 'this'Métodos (funciones miembro)Atributos (miembros de datos)Fundamentos de constructores y destructoresRepaso: calculadora sencilla4Propiedades de clase
Miembros de instancia vs. estáticosGetters y settersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases friendRepaso: gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de constructores y destructoresSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualRepaso: jerarquía de empleados2Gestión de memoria
Memoria de pila vs. heapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Repaso: gestor de arreglos dinámicos5Encapsulación
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultación de informaciónStruct vs. classClases anidadas e internasRepaso: sistema de registros de estudiantes8Polimorfismo
Polimorfismo en compilación y en tiempo de ejecuciónSobrecarga de funcionesRepaso de las funciones virtualesFunciones virtuales purasClases abstractasDiseño de interfaces en C++Conversión dinámica y RTTIRepaso: calculadora de formas11Conceptos avanzados de POO
Composición frente a herenciaMixins mediante CRTPIdiom PimplBorrado de tiposClases enum y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y destructores
Constructor predeterminadoConstructor con parámetrosConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis detallado del destructorRegla de tres / cinco / ceroRepaso: clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujoSobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tipoRepaso: clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasFundamentos de SFINAE y rasgos de tiposRepaso: contenedor genéricoPractica por tu cuenta: Compilador de C++ online