🧩 Exercícios: Classes, Construtores, Destruidores e Encapsulamento (RAII)
Spec Sistemas Com Cpp • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 09.1 — Classe com Encapsulamento e Lista de Inicialização de Membros
Contexto: Classe com Encapsulamento e Lista de Inicialização de Membros no contexto de Classes, Construtores, Destruidores e Encapsulamento (RAII).
Requisitos de Execução:
- Criar classe
ContaBancariacom construtor inicializando saldo com lista: titular_{t}, saldo_{s}.
Resultado Esperado
Objeto instanciado com membros inicializados na lista de inicialização.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_09_1_SeuNome - Envie na tarefa:
Atividade Cap 09 - Classes, Construtores, Destruidores e Encapsulamento (RAII)
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <string>
class ContaBancaria {
private:
std::string titular_;
double saldo_;
public:
ContaBancaria(std::string t, double s) : titular_{std::move(t)}, saldo_{s} {}
void depositar(double v) { saldo_ += v; }
double get_saldo() const { return saldo_; }
};
int main() {
ContaBancaria c{"Carlos", 1000.0};
c.depositar(500.0);
std::cout << "Saldo atual: R$ " << c.get_saldo() << std::endl;
return 0;
}
🔍 Nível 2: Prática
Problema 09.2 — Padrão RAII (Resource Acquisition Is Initialization)
Contexto: Padrão RAII (Resource Acquisition Is Initialization) no contexto de Classes, Construtores, Destruidores e Encapsulamento (RAII).
Requisitos de Execução:
- Criar classe guardiã que abra recurso no construtor e feche automaticamente no destruidor
~GuardiaoRecurso().
Resultado Esperado
Recurso liberado deterministicamente no momento da saída do escopo.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_09_2_SeuNome - Envie na tarefa:
Atividade Cap 09 - Classes, Construtores, Destruidores e Encapsulamento (RAII)
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
class ArquivoGuard {
public:
ArquivoGuard() { std::cout << "Recurso ALOCADO no construtor.\n"; }
~ArquivoGuard() { std::cout << "Recurso LIBERADO no destruidor.\n"; }
};
int main() {
{
ArquivoGuard guard;
std::cout << "Executando operacoes dentro do bloco escopado...\n";
} // Destruidor executado automaticamente aqui
return 0;
}
⚡ Nível 3: Integração
Problema 09.3 — Regra dos Três/Cinco (Rule of 5) e Construtores de Cópia/Movimento
Contexto: Regra dos Três/Cinco (Rule of 5) e Construtores de Cópia/Movimento no contexto de Classes, Construtores, Destruidores e Encapsulamento (RAII).
Requisitos de Execução:
- Implementar construtor de cópia e operador de atribuição profunda em classe que gerencie heap.
Resultado Esperado
Cópia profunda executada garantindo buffers independentes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_09_3_SeuNome - Envie na tarefa:
Atividade Cap 09 - Classes, Construtores, Destruidores e Encapsulamento (RAII)
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
class Buffer {
int* ptr_;
public:
Buffer(int val) : ptr_{new int(val)} {}
~Buffer() { delete ptr_; }
Buffer(const Buffer& outro) : ptr_{new int(*outro.ptr_)} {} // Copia profunda
int get() const { return *ptr_; }
};
int main() {
Buffer b1{42};
Buffer b2 = b1;
std::cout << "Buffer clonado: " << b2.get() << std::endl;
return 0;
}
🏆 Nível 4: Desafio Corporativo
Problema 09.4 — Membros Estáticos, Construtores Explícitos (explicit) e Métodos =delete
Contexto: Membros Estáticos, Construtores Explícitos (explicit) e Métodos =delete no contexto de Classes, Construtores, Destruidores e Encapsulamento (RAII).
Requisitos de Execução:
- Desabilitar conversões implícitas com
explicite proibir cópias comBuffer(const Buffer&) = delete.
Resultado Esperado
Cópias acidentais e conversões implícitas bloqueadas pelo compilador.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_09_4_SeuNome - Envie na tarefa:
Atividade Cap 09 - Classes, Construtores, Destruidores e Encapsulamento (RAII)
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
class SocketConexao {
public:
explicit SocketConexao(int porta) { std::cout << "Socket na porta " << porta << "\n"; }
SocketConexao(const SocketConexao&) = delete; // Proíbe cópia
SocketConexao& operator=(const SocketConexao&) = delete;
};
int main() {
SocketConexao s{8080};
return 0;
}