Carregando...

Classes e objetos

Em C++, classes e objetos são os pilares da programação orientada a objetos (POO). Uma classe funciona como um molde ou modelo que define atributos (dados) e métodos (funções) que descrevem o comportamento dos objetos. Um objeto é uma instância concreta de uma classe, possuindo estado e comportamento definidos pelo seu modelo. O uso de classes e objetos permite criar código modular, reutilizável e de fácil manutenção.
Classes suportam princípios fundamentais da POO, como encapsulamento, herança e polimorfismo. Elas ajudam a organizar dados e a implementar algoritmos complexos de forma estruturada. Na engenharia de software, classes são usadas para modelar entidades reais, organizar a arquitetura de sistemas e otimizar desempenho. A compreensão profunda de classes e objetos permite ao desenvolvedor criar sistemas escaláveis e eficientes.
Neste tutorial, você aprenderá a definir classes, criar objetos, implementar métodos, aplicar algoritmos e usar boas práticas de C++ como const-correctness, gerenciamento de memória, integração com STL e otimização de performance. Além disso, serão abordadas armadilhas comuns como vazamento de memória, tratamento inadequado de erros e uso ineficiente de algoritmos. Este conhecimento é essencial para desenvolver aplicações profissionais robustas em C++.

Exemplo Básico

text
TEXT Code
\#include <iostream>
\#include <string>

class Funcionario {
private:
std::string nome;
int id;
double salario;

public:
// Construtor
Funcionario(const std::string& nomeFuncionario, int idFuncionario, double salarioFuncionario)
: nome(nomeFuncionario), id(idFuncionario), salario(salarioFuncionario) {}

// Métodos setters
void setNome(const std::string& nomeFuncionario) { nome = nomeFuncionario; }
void setId(int idFuncionario) { id = idFuncionario; }
void setSalario(double salarioFuncionario) { salario = salarioFuncionario; }

// Métodos getters
std::string getNome() const { return nome; }
int getId() const { return id; }
double getSalario() const { return salario; }

// Método de exibição
void exibir() const {
std::cout << "ID: " << id << "\n"
<< "Nome: " << nome << "\n"
<< "Salário: R$" << salario << "\n";
}

};

int main() {
Funcionario f1("João Silva", 101, 7500.50);
f1.exibir();

f1.setSalario(8000.75);
std::cout << "Salário atualizado: R$" << f1.getSalario() << "\n";

return 0;

}

No exemplo acima, a classe Funcionario contém três atributos privados: nome, id e salario. O encapsulamento protege os dados, garantindo acesso apenas através dos métodos públicos setters e getters. O construtor inicializa o objeto ao ser criado, enquanto o método exibir apresenta seus valores. Métodos constantes (const) asseguram que o estado do objeto não seja modificado, promovendo segurança e clareza no código. Este padrão é aplicável em sistemas reais de gestão de funcionários e evita vazamentos de memória ao utilizar objetos na pilha.

Exemplo Prático

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>

class Produto {
private:
std::string nome;
int id;
double preco;

public:
Produto(const std::string& nomeProduto, int idProduto, double precoProduto)
: nome(nomeProduto), id(idProduto), preco(precoProduto) {}

void setPreco(double precoProduto) { preco = precoProduto; }
double getPreco() const { return preco; }
std::string getNome() const { return nome; }

void exibir() const {
std::cout << "ID: " << id << ", Nome: " << nome
<< ", Preço: R$" << preco << "\n";
}

};

class Inventario {
private:
std::vector<Produto> produtos;

public:
void adicionarProduto(const Produto& prod) { produtos.push_back(prod); }

void exibirTodos() const {
std::cout << "Inventário:\n";
for (const auto& prod : produtos)
prod.exibir();
}

void aplicarDesconto(double percentual) {
for (auto& prod : produtos) {
double desconto = prod.getPreco() * (1.0 - percentual / 100.0);
prod.setPreco(desconto);
}
}

void ordenarPorPreco() {
std::sort(produtos.begin(), produtos.end(),
[](const Produto& a, const Produto& b) { return a.getPreco() < b.getPreco(); });
}

};

int main() {
Inventario loja;
loja.adicionarProduto(Produto("Notebook", 201, 1200.00));
loja.adicionarProduto(Produto("Smartphone", 202, 800.50));
loja.adicionarProduto(Produto("Fones", 203, 150.75));

loja.exibirTodos();
std::cout << "\nAplicando 10% de desconto...\n";
loja.aplicarDesconto(10);
loja.ordenarPorPreco();
loja.exibirTodos();

return 0;

}

Neste exemplo avançado, a classe Produto representa itens individuais, enquanto a classe Inventario gerencia a coleção de produtos. Os métodos aplicarDesconto e ordenarPorPreco demonstram algoritmos aplicados a objetos. O uso de STL e expressões lambda otimiza o desempenho e evita vazamentos de memória. O design respeita os princípios de POO, incluindo encapsulamento, agregação e responsabilidade única, facilitando manutenção e escalabilidade do sistema.

Boas práticas para classes e objetos em C++ incluem: uso correto de construtores e destrutores, atributos privados, const-correctness, uso de containers STL, listas de inicialização e passagem de objetos por referência. Erros comuns incluem uso incorreto de memória, exposição de atributos privados, algoritmos ineficientes e falta de tratamento de erros. RAII, smart pointers e alocação na pilha ajudam a gerenciar recursos de forma segura. Para otimização, prefira referências, utilize move-semantics e minimize cópias desnecessárias. Segurança é reforçada pela validação de entradas e proteção de dados sensíveis.

📊 Tabela de Referência

C++ Element/Concept Description Usage Example
Class Molde para criar objetos com atributos e métodos class Funcionario { private: std::string nome; public: void setNome(std::string n) { nome=n; } };
Object Instância concreta de uma classe Funcionario f1("João",101,7500.50);
Constructor Inicializa o objeto ao ser criado Funcionario(const std::string& n,int i,double s):nome(n),id(i),salario(s){}
Destructor Libera recursos ao destruir o objeto \~Funcionario() { /* cleanup */ }
Encapsulation Protege dados e controla acesso private: int id; public: void setId(int i){id=i;}
Member Function Método dentro da classe para manipular dados void exibir() const { std::cout<\<nome; }

Dominar classes e objetos permite modelar sistemas complexos, implementar algoritmos eficientes e construir arquiteturas de software de fácil manutenção. Principais aprendizados incluem a importância do encapsulamento e do comportamento controlado dos objetos, permitindo projetos escaláveis e robustos. Próximos passos recomendados incluem estudar herança, polimorfismo e padrões de projeto, ampliando a capacidade de criar aplicações modulares e eficientes. Documentação do C++, STL e livros avançados são recursos valiosos para continuar o aprendizado.

🧠 Teste Seu Conhecimento

Pronto para Começar

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
Perguntas
🎯
70%
Para Passar
♾️
Tempo
🔄
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo