Aula 10 - Construtores e Destrutores 🏗️
Nesta aula, aprenderemos como gerenciar o ciclo de vida de um objeto: desde o seu nascimento (construção) até o seu fim (destruição).
🏗️ Construtores
Um Construtor é um método especial que é chamado automaticamente quando criamos um objeto. Ele tem o mesmo nome da classe e não possui tipo de retorno.
Construtor Padrão (Default)
Iniciado sem parâmetros.
Construtor Parametrizado
Iniciado com valores específicos.
class Pessoa {
private:
std::string nome;
public:
Pessoa(std::string n) : nome(n) {} // Lista de Inicialização
};
💣 Destrutor
O Destrutor é chamado quando o objeto sai de escopo ou é deletado. Seu nome começa com um til (~). É o lugar perfeito para liberar memória ou fechar arquivos.
class BancoDados {
public:
~BancoDados() { std::cout << "Conexão encerrada com segurança." << std::endl; }
};
📜 Regra dos Três (Rule of Three)
No C++ clássico, se você precisar definir um dos três, provavelmente precisará definir todos para evitar bugs de memória: 1. Destrutor 2. Construtor de Cópia 3. Operador de Atribuição
🧠 Lista de Inicialização
Performance
Use sempre a lista de inicialização (: atrib(valor)) em vez de atribuir valores dentro do corpo do construtor. Isso é mais eficiente pois evita a criação de um objeto temporário vazio.
Sobrecarga
Você pode ter vários construtores para a mesma classe, permitindo criar objetos de diferentes formas.
💻 Exemplo Prático: Gerenciador de Log
#include <iostream>
#include <string>
class Logger {
private:
std::string prefixo;
public:
// Construtor com valor padrão
Logger(std::string p = "LOG") : prefixo(p) {
std::cout << "[" << prefixo << "] Logger Iniciado." << std::endl;
}
// Destrutor
~Logger() {
std::cout << "[" << prefixo << "] Logger Finalizado." << std::endl;
}
void log(std::string mensagem) {
std::cout << "[" << prefixo << "] " << mensagem << std::endl;
}
};
int main() {
{
Logger meuLog("SISTEMA");
meuLog.log("Iniciando processamento...");
} // O Logger é destruído AQUI ao sair das chaves
std::cout << "Fim da execução." << std::endl;
return 0;
}
📝 Exercício de Fixação
- Construtor: Crie uma classe
Carroonde o construtor peça a marca e o ano. - Destrutor: Adicione um destrutor à classe
Carroque imprima "Carro [Marca] enviado para o desmanche". - Desafio: Implemente uma classe
Bufferque aloque dinamicamente um array no construtor e use o destrutor para garantir que a memória seja liberada.
🚀 Mini-Projeto da Aula
Sistema de Sessão de Usuário:
Crie uma classe Sessao que armazene o ID do usuário. O construtor deve registrar o horário de login (pode ser um texto simples) e o destrutor deve registrar o horário de logout. Simule múltiplos logins no main usando blocos {} para ver os objetos sendo criados e destruídos.