Sobrecarga de Operadores em C++: Guia Prático com Exemplos de Código
O que é Sobrecarga de Operadores?
Usando sobrecarga de operadores em C++, você pode atribuir múltiplos significados a um operador dentro do mesmo escopo. O objetivo é dar um comportamento personalizado a um operador para um tipo definido pelo usuário.
Com sobrecarga de operadores, você pode redefinir a maioria dos operadores C++ e realizar diferentes operações usando um único símbolo.
Neste tutorial você aprenderá:
- O que é sobrecarga de operadores
- Sintaxe
- Diferentes abordagens para sobrecarregar operadores em C++
- Quais operadores não podem ser sobrecarregados
- Considerações importantes
- Regras para sobrecarga de operadores
- Como sobrecarregar um operador na prática
Sintaxe
Para sobrecarregar um operador C++, defina uma função membro especial dentro de uma classe da seguinte forma:
class nome_classe {
...
public:
tipo_retorno operator simbolo (argumento(s)) {
...
}
...
};
Os componentes são:
- tipo_retorno – o tipo retornado pela função operador.
- operator – a palavra-chave que inicia a declaração.
- simbolo – o operador que você quer sobrecarregar, ex.
+,-,<,++. - argumento(s) – parâmetros, como qualquer outra função.
Exemplo 1: Sobrecarga do Operador Decremento Prefixado
#include <iostream>
using namespace std;
class ClasseTeste {
private:
int contador;
public:
ClasseTeste() : contador(5) {}
void operator --() {
contador = contador - 3;
}
void Exibir() {
cout << "Contador: " << contador;
}
};
int main() {
ClasseTeste ct;
--ct;
ct.Exibir();
return 0;
}
Saída:
Contador: 2
Explicação do Código:
- Inclui
<iostream>para acessar facilidades de entrada/saída. - Usa namespace
stdpara brevidade. - Define classe
ClasseTeste. - Torna
contadorum membro de dado privado. - Fornece construtor público que inicializa
contadorcom 5. - Sobrecarrega o operador prefixado
--para subtrair 3 decontador. - Implementa
Exibir()para imprimir o valor atual. - Em
main(), cria uma instância, aplica o operador sobrecarregado e exibe o resultado.
Diferentes Abordagens para Sobrecarga de Operadores em C++
A sobrecarga pode ser alcançada através de:
- Funções membro
- Funções não-membro (friend ou free functions)
- Funções friend (quando acesso a dados privados é necessário)
- Se o operando esquerdo é um objeto da classe, uma função membro é tipicamente usada.
- Quando o operando esquerdo é de tipo diferente, uma função não-membro é requerida.
- Funções friend são úteis quando o operador precisa acessar membros privados ou protegidos.
Todos os Operadores C++ Podem Ser Sobrecarregados?
Não. Os seguintes operadores não são sobrecarregáveis:
::– resolução de escopo?:– condicional ternário.– acesso a membrosizeof– consulta de tamanho*(seletor de ponteiro para membro)
Coisas para Lembrar
- A sobrecarga afeta apenas tipos definidos pelo usuário; tipos built-in mantêm seu comportamento original.
- Os operadores de atribuição (
=) e endereço-de (&) são automaticamente sobrecarregados para classes que fornecem construtores de cópia ou operadores de atribuição. - A precedência de operadores permanece inalterada; você pode usar parênteses para forçar ordem de avaliação.
- Três operadores—
::,.,?:—são explicitamente proibidos de sobrecarga.
Regras para Sobrecarga de Operadores
- Pelo menos um operando deve ser um tipo de classe definido pelo usuário.
- Apenas operadores existentes podem ser sobrecarregados; você não pode introduzir novos símbolos de operador.
- Alguns operadores (ex.:
new,delete) não podem ser sobrecarregados como funções friend mas podem ser sobrecarregados como funções membro.
Como Sobrecarregar um Operador
Exemplo 1: Operador Incremento
#include <iostream>
using namespace std;
class SobrecargaOperador {
private:
int x;
public:
SobrecargaOperador() : x(10) {}
void operator ++() {
x += 2;
}
void Imprimir() {
cout << "A Contagem é: " << x;
}
};
int main() {
SobrecargaOperador so;
++so;
so.Imprimir();
return 0;
}
Saída:
A Contagem é: 12
Exemplo 2: Adição de Números Complexos
#include <iostream>
using namespace std;
class ClasseTeste {
private:
int real, imag;
public:
ClasseTeste(int rl = 0, int im = 0) : real(rl), imag(im) {}
ClasseTeste operator + (ClasseTeste const &obj) {
ClasseTeste resultado;
resultado.real = real + obj.real;
resultado.imag = imag + obj.imag;
return resultado;
}
void imprimir() {
cout << real << " + i" << imag << endl;
}
};
int main() {
ClasseTeste c1(9, 5), c2(4, 3);
ClasseTeste c3 = c1 + c2;
c3.imprimir();
}
Saída:
13 + i8
Explicação do Código:
- Inclui
<iostream>e usa namespacestd. - Define
ClasseTestecom componentesrealeimag. - Fornece construtor para inicialização.
- Sobrecarrega operador
+para realizar adição de números complexos. - Retorna nova instância
ClasseTestecontendo a soma. - Implementa
imprimir()para exibir o número complexo. - Em
main(), cria duas instâncias, soma-as e imprime o resultado.
Resumo
- Sobrecarga de operadores permite múltiplos significados para um operador dentro de um escopo.
- Fornece comportamento personalizado para tipos definidos pelo usuário.
- A maioria dos operadores C++ pode ser sobrecarregada, mas alguns não podem.
- Pelo menos um operando deve ser um tipo definido pelo usuário.
- Apenas operadores existentes são sobrecarregáveis.
Linguagem C
- Como Passar Arrays para Funções em C++: Guia Prático
- Dominando Sobrecarga de Operadores em Python: Guia Prático
- Operadores em C++ Explicados: Tipos, Exemplos e Programas Práticos
- Laço do-while em C++: Sintaxe, Exemplos Práticos e Loops Aninhados
- Dominando Ponteiros em C++: Conceitos, Exemplos e Aplicações Práticas
- Dominando o Tipo Char em C++: Declaração, ASCII e Técnicas de Conversão
- Structs em C++ Explicadas com Exemplo Prático
- Dominando std::list em C++: Sintaxe, Funções e Exemplos Práticos
- Funções em C++ Explicadas com Exemplos Práticos de Código
- Dominando Funções Lambda em Python: Exemplos Práticos e Boas Práticas