Aula 12 - Sobrecarga de Operadores ⚖️
Nesta aula, aprenderemos como ensinar ao C++ como lidar com operadores nativos (+, -, *, <<) em nossas próprias classes.
⚖️ O que é Sobrecarga de Operador?
É a capacidade de redefinir o comportamento de operadores para tipos definidos pelo usuário. Isso torna o código muito mais intuitivo e legível.
Sem sobrecarga: res = c1.somar(c2);
Com sobrecarga: res = c1 + c2;
➕ Operadores Aritméticos
Para sobrecarregar um operador, criamos uma função com o nome operator seguido do símbolo desejado.
class Ponto {
public:
int x, y;
Ponto operator+(const Ponto& outro) {
return {x + outro.x, y + outro.y};
}
};
📤 Operador de Fluxo (<<)
Muito útil para imprimir objetos diretamente com std::cout. Ele deve ser implementado como uma função amiga (friend) ou fora da classe.
friend std::ostream& operator<<(std::ostream& os, const Ponto& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
🧠 Boas Práticas
Preserve o Sentido
Não sobrecarregue o operador + para fazer uma subtração. Isso confunde outros desenvolvedores e torna o código imprevisível.
Operadores de Comparação
Sobrecarregar os operadores == e < é essencial se você pretende usar seus objetos em containers da STL que precisam de ordenação ou busca.
💻 Exemplo Prático: Números Complexos
#include <iostream>
class Complexo {
private:
double real, imag;
public:
Complexo(double r = 0, double i = 0) : real(r), imag(i) {}
// Sobrecarga do +
Complexo operator+(const Complexo& outro) {
return Complexo(real + outro.real, imag + outro.imag);
}
// Sobrecarga do << para impressão fácil
friend std::ostream& operator<<(std::ostream& os, const Complexo& c) {
os << c.real << " + " << c.imag << "i";
return os;
}
};
int main() {
Complexo c1(3, 4);
Complexo c2(1, 2);
Complexo c3 = c1 + c2;
std::cout << "C1: " << c1 << std::endl;
std::cout << "C2: " << c2 << std::endl;
std::cout << "Soma: " << c3 << std::endl;
return 0;
}
📝 Exercício de Fixação
- Aritmética: Crie uma classe
Vetor2De sobrecarregue o operador-para subtrair dois vetores. - Comparação: Adicione o operador
==à classeVetor2Dpara verificar se dois vetores são idênticos. - Desafio: Sobrecarregue o operador
[]para acessar os componentesx(índice 0) ey(índice 1) de um objetoVetor2D.
🚀 Mini-Projeto da Aula
Calculadora de Tempo:
Crie uma classe Tempo (Horas, Minutos, Segundos). Sobrecarregue o operador + para somar dois horários, garantindo que os minutos e segundos extras sejam convertidos corretamente (ex: 70 segundos -> 1 minuto e 10 segundos). Implemente também o operador << para exibir o tempo no formato HH:MM:SS.