C++ POO Básico
Construtores e destrutores
Em C++, construtores e destrutores são funções especiais que gerenciam o ciclo de vida dos objetos. O construtor é chamado automaticamente quando um objeto é criado e inicializa seus membros. O destrutor é chamado quando o objeto é destruído e libera recursos.
A lista de inicialização é a forma idiomática de inicializar membros no construtor. Ela é obrigatória para membros const, referências e objetos sem construtor padrão. Além disso, evita inicialização seguida de atribuição.
O construtor padrão é aquele que pode ser chamado sem argumentos. Se nenhum construtor for declarado, o compilador gera um implicitamente. Já a palavra-chave explicit impede conversões implícitas indesejadas em construtores de um argumento.
Neste card, você verá como definir construtores, usar a lista de inicialização, criar destrutores e aplicar explicit para evitar conversões acidentais.
Pontos-chave
- Construtores inicializam objetos; destrutores liberam recursos.
- Use a lista de inicialização para inicializar membros de forma eficiente e obrigatória em alguns casos.
- O construtor padrão pode ser gerado pelo compilador se nenhum outro for declarado.
explicitevita conversões implícitas em construtores de um argumento.- O destrutor não recebe argumentos e não retorna valor.
#include <iostream>
#include <string>
class Recurso {
public:
// Construtor padrão
Recurso() : nome_("padrao"), valor_(0) {
std::cout << "Construtor padrao: " << nome_ << "\n";
}
// Construtor com lista de inicialização
explicit Recurso(const std::string& nome, int valor = 0)
: nome_(nome), valor_(valor) {
std::cout << "Construtor: " << nome_ << " = " << valor_ << "\n";
}
// Destrutor
~Recurso() {
std::cout << "Destrutor: " << nome_ << "\n";
}
void mostrar() const {
std::cout << nome_ << ": " << valor_ << "\n";
}
private:
std::string nome_;
int valor_;
};
int main() {
Recurso r1; // chama construtor padrão
Recurso r2("teste", 42); // chama construtor com argumentos
r1.mostrar();
r2.mostrar();
// Recurso r3 = "invalido"; // erro: construtor é explicit
Recurso r3 = Recurso("copia"); // ok: construção explícita
r3.mostrar();
return 0;
}