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
- Não mude a natureza do operador (Não use
+ para subtrair).
- Mantenha a semântica intuitiva.
- 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