Revisã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 criar uma classe String completa que gerencia seu próprio array dinâmico de caracteres, reunindo todos os conceitos de construtores e destrutor deste capítulo. Este é um exercício clássico que reproduz como 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 e defina length como 0). Imprima
"Default constructed" - Um construtor parametrizado que recebe um
const char*e copia a string C para uma memória recém-alocada. Imprima"Constructed: <text>" - Um construtor de cópia que realiza uma cópia profunda de outra String. Imprima
"Copied: <text>" - Um construtor de movimento (marcado com
noexcept) que transfere a propriedade. Imprima"Moved: <text>"usando o texto antes de definir a origem como nula - Um destrutor que libera a memória com segurança (verifique se é nula). Imprima
"Destroyed: <text>"(imprima"Destroyed: (empty)"se data for nulo ou length for 0) - Um método
size()que retorna o tamanho - Um método
c_str()que retorna o ponteiro para os caracteres (retorne""se for nulo)
- Um construtor padrão que cria uma string vazia (aloque um único caractere para o terminador nulo e defina length como 0). Imprima
main.cpp: demonstre todos os construtores funcionando em conjunto. Leia uma string de texto da entrada e, então:- Crie uma
Stringchamadas1usando o construtor padrão - Crie uma
Stringchamadas2com o texto de entrada - Crie uma
Stringchamadas3copiandos2 - Crie uma
Stringchamadas4movendo a partir 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 obter eficiência. Após o movimento, s2 deve estar vazia, com tamanho 0, enquanto s4 contém o texto original. As mensagens do destrutor no final mostrarão os quatro objetos sendo liberados na ordem inversa à criação.
Inclua <cstring> para strlen e strcpy, e <utility> para std::move(). Não se esqueça dos protetores de inclusão no 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 POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online