Pular para conteúdo

Aula 12 - Sobrecarga de Operadores ⚖️


Por que sobrecarregar?

  • Tornar o uso de objetos tão intuitivo quanto tipos primitivos.
  • Ex: vetor1 + vetor2 em vez de vetor1.somar(vetor2).

Operadores que PODEM ser sobrecarregados

  • Praticamente todos: + - * / % == != < > << >> [] () ...

Operadores que NÃO PODEM

  • . (ponto)
  • :: (escopo)
  • ?: (ternário)
  • sizeof
  • .* (ponto asterisco)

Sintaxe da Sobrecarga

TipoRetorno operator#(parametros) { ... }

Exemplo: Operador +

Ponto operator+(const Ponto& outro) {
    return Ponto(x + outro.x, y + outro.y);
}

Sobrecarga via Método de Classe

  • O primeiro operando é o próprio objeto (this).

Sobrecarga via Função Global (Friend)

  • Usada quando o primeiro operando não é da nossa classe (ex: cout).

Friend Functions (Amigas)

  • Funções fora da classe que podem acessar membros privados.
  • Use com moderação!

Sobrecarga de Fluxo (<< e >>)

  • Permite usar cout << obj; e cin >> obj;.
  • Deve ser feita via função global.

Exemplo: operator<<

ostream& operator<<(ostream& os, const Ponto& p) {
    os << "(" << p.x << ", " << p.y << ")";
    return os;
}

Operador de Atribuição (=)

  • Fundamental para classes que gerenciam memória dinâmica.
  • Deve verificar auto-atribuição (if (this == &outro)).

Operadores de Comparação (== e !=)

  • Facilitam o uso em buscas e algoritmos da STL.

Operador Subscrito ([ ])

  • Permite que a classe se comporte como um array.
  • Ex: Uma classe MinhaLista.

Operador de Chamada de Função ( ( ) )

  • Atribui comportamento de função ao objeto (Functors).

Operadores Unários (++, --)

  • Distinção entre prefixo ++obj e sufixo obj++.

Prefix vs Postfix

  • No sufixo, adicionamos um parâmetro fantasma: operator++(int).

Regras de Ouro

  1. Não mude a natureza do operador (Não use + para subtrair).
  2. Mantenha a semântica intuitiva.
  3. Sobrecarga não deve ser mágica negra, mas conveniência.

Lógica de Operadores Lógicos

  • Cuidado ao sobrecarregar && e ||, pois perde-se o comportamento de "Short-circuit".

Operadores de Conversão

  • Permitem que um objeto seja convertido em outro tipo automaticamente.
  • operator double() { return valor; }

Conversões Implícitas vs explícitas

  • Prefira explicit operator bool() para evitar erros bobos.

Resumo da Aula

  • Sobrecarga é açúcar sintático poderoso.
  • Use prioritariamente para classes matemáticas ou containers.

Fim da Aula 12

  • Próxima aula: STL!