Recapitulação - Classe String
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 26 de 104.
Desafio
FácilVamos construir uma classe String completa que gerencia seu próprio array dinâmico de caracteres, reunindo todos os conceitos de construtor e destrutor deste capítulo. Este é um exercício clássico que reflete como a std::string funciona internamente.
Você criará dois arquivos para organizar seu código:
String.h: Defina sua classeStringseguindo a Regra dos Cinco. Sua classe deve gerenciar um ponteirochar*chamadodatae um membrosize_t length. Implemente:- Um construtor padrão que cria uma string vazia (aloque um único caractere para o terminador nulo, defina o comprimento como 0). Imprima
"Default constructed" - Um construtor parametrizado que recebe um
const char*e copia a C-string para uma memória recém-alocada. Imprima"Constructed: <text>" - Um construtor de cópia que realiza uma cópia profunda (deep copy) de outra String. Imprima
"Copied: <text>" - Um construtor de movimento (marcado como
noexcept) que transfere a propriedade. Imprima"Moved: <text>"usando o texto antes de anular a origem - Um destrutor que libera a memória com segurança (verifique se é nulo). Imprima
"Destroyed: <text>"(imprima"Destroyed: (empty)"se data for nulo ou length for 0) - Um método
size()que retorna o comprimento - Um método
c_str()que retorna o ponteiro de caracteres (retorne""se for nulo)
- Um construtor padrão que cria uma string vazia (aloque um único caractere para o terminador nulo, defina o comprimento como 0). Imprima
main.cpp: Demonstre todos os construtores trabalhando juntos. Leia uma string de texto da entrada e, em seguida:- Crie uma
Stringchamadas1usando o construtor padrão - Crie uma
Stringchamadas2com o texto de entrada - Crie uma
Stringchamadas3copiandos2 - Crie uma
Stringchamadas4movendo des2 - Imprima
"--- Status ---" - Para cada string (de s1 a s4), imprima
"s<n>: \"<text>\" (length: <len>)"
- Crie uma
Use listas de inicialização em todos os construtores para maior eficiência. Após o movimento, s2 deve estar vazia com comprimento 0, enquanto s4 mantém o texto original. As mensagens do destrutor ao final mostrarão os quatro objetos sendo limpos na ordem inversa da criação.
Inclua <cstring> para strlen e strcpy, e <utility> para std::move(). Não se esqueça dos header guards em seu arquivo de cabeçalho.
Experimente você mesmo
#include <iostream>
#include <string>
#include "String.h"
using namespace std;
int main() {
string input;
getline(cin, input);
// TODO: Criar String s1 usando o construtor padrão
// TODO: Criar String s2 com o texto de entrada
// TODO: Criar String s3 copiando s2
// TODO: Criar String s4 movendo de s2 (use std::move)
// Imprimir o cabeçalho de status
cout << "--- Status ---" << endl;
// TODO: Imprimir o status para cada string de s1 a s4
// Formato: "s<n>: \"<text>\" (length: <len>)"
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico