Resumen - 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ácilConstruyamos una clase String completa que administre su propio arreglo dinámico de caracteres, reuniendo 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 los Cinco. Tu clase debe administrar un punterochar*llamadodatay un miembrosize_t length. Implementa:- Un constructor predeterminado que cree una cadena vacía (asigna un solo carácter para el terminador nulo y establece length 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 otro String. Imprime
"Copied: <text>" - Un constructor de movimiento (marcado con
noexcept) que transfiera la propiedad. Imprime"Moved: <text>"usando el texto antes de anular la fuente - Un destructor que libere la memoria de forma segura (comprueba si es nula). Imprime
"Destroyed: <text>"(imprime"Destroyed: (empty)"si data es nulo 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 nulo)
- Un constructor predeterminado que cree una cadena vacía (asigna un solo carácter para el terminador nulo y establece length en 0). Imprime
main.cpp: Demuestra 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 desdes2 - Imprime
"--- Status ---" - Para cada cadena (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ío y tener una longitud de 0, mientras que s4 contiene el texto original. Los mensajes del destructor al final mostrarán que los cuatro objetos se limpian en orden inverso al de su creación.
Incluye <cstring> para strlen y strcpy, y <utility> para std::move(). No olvides las protecciones contra inclusiones múltiples en tu archivo de cabecera.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Crear String s1 usando el constructor por defecto
// TODO: Crear String s2 con el texto de entrada
// TODO: Crear String s3 copiando s2
// TODO: Crear String s4 moviendo desde s2 (usar std::move)
// Imprimir el encabezado de estado
cout << "--- Status ---" << endl;
// TODO: Imprimir el estado de cada string de s1 a s4
// Formato: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes 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 por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genéricoPractica por tu cuenta: Compilador de C++ online