Menu
Coddy logo textTech

Recapitulação - Classe String

Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 26 de 104.

challenge icon

Desafio

Fácil

Vamos 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 classe String seguindo a Regra dos Cinco. Sua classe deve gerenciar um ponteiro char* chamado data e um membro size_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)
  • main.cpp: Demonstre todos os construtores trabalhando juntos. Leia uma string de texto da entrada e, em seguida:
    • Crie uma String chamada s1 usando o construtor padrão
    • Crie uma String chamada s2 com o texto de entrada
    • Crie uma String chamada s3 copiando s2
    • Crie uma String chamada s4 movendo de s2
    • Imprima "--- Status ---"
    • Para cada string (de s1 a s4), imprima "s<n>: \"<text>\" (length: <len>)"

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