Ripasso - classe String
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 26 di 104.
Sfida
FacileCostruiamo una classe String completa che gestisca il proprio array dinamico di caratteri, riunendo tutti i concetti relativi a costruttori e distruttori di questo capitolo. È un esercizio classico che riproduce il funzionamento interno di std::string.
Creerai due file per organizzare il codice:
String.h: definisci la classeStringseguendo la Rule of Five. La classe deve gestire un puntatorechar*chiamatodatae un membrosize_t length. Implementa:- Un costruttore predefinito che crea una stringa vuota (alloca un singolo carattere per il terminatore nullo e imposta la lunghezza a 0). Stampa
"Default constructed" - Un costruttore con parametri che accetta un
const char*e copia la stringa C in memoria appena allocata. Stampa"Constructed: <text>" - Un costruttore di copia che esegue una copia profonda di un'altra String. Stampa
"Copied: <text>" - Un costruttore di spostamento (contrassegnato con
noexcept) che trasferisce la proprietà. Stampa"Moved: <text>"usando il testo prima di azzerare la sorgente - Un distruttore che libera la memoria in modo sicuro (controlla che non sia null). Stampa
"Destroyed: <text>"(stampa"Destroyed: (empty)"se data è null o la lunghezza è 0) - Un metodo
size()che restituisce la lunghezza - Un metodo
c_str()che restituisce il puntatore ai caratteri (restituisce""se è null)
- Un costruttore predefinito che crea una stringa vuota (alloca un singolo carattere per il terminatore nullo e imposta la lunghezza a 0). Stampa
main.cpp: mostra il funzionamento congiunto di tutti i costruttori. Leggi una stringa di testo dall'input, poi:- Crea una
Stringchiamatas1usando il costruttore predefinito - Crea una
Stringchiamatas2con il testo inserito - Crea una
Stringchiamatas3copiandos2 - Crea una
Stringchiamatas4spostandos2 - Stampa
"--- Status ---" - Per ogni stringa (da s1 a s4), stampa
"s<n>: \"<text>\" (length: <len>)"
- Crea una
Usa liste di inizializzazione in tutti i costruttori per maggiore efficienza. Dopo lo spostamento, s2 dovrebbe essere vuota e avere lunghezza 0, mentre s4 conterrà il testo originale. I messaggi del distruttore alla fine mostreranno la pulizia di tutti e quattro gli oggetti in ordine inverso rispetto alla loro creazione.
Includi <cstring> per strlen e strcpy e <utility> per std::move(). Non dimenticare le protezioni dell'header nel file header.
Provalo tu
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Crea String s1 usando il costruttore predefinito
// TODO: Crea String s2 con il testo di input
// TODO: Crea String s3 copiando s2
// TODO: Crea String s4 spostando da s2 (usa std::move)
// Stampa l'intestazione dello stato
cout << "--- Status ---" << endl;
// TODO: Stampa lo stato di ogni stringa da s1 a s4
// Formato: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online