Introdução à Sobrecarga de Operadores
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 40 de 104.
Sobrecarga de operadores permite que você defina como operadores como +, -, ou == se comportam quando usados com suas classes personalizadas. Em vez de chamar métodos como a.add(b), você pode escrever o mais intuitivo a + b.
Em C++, operadores são essencialmente funções com nomes especiais. Para sobrecarregar um operador, você define uma função usando a palavra-chave operator seguida pelo símbolo:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// Sobrecarga do operador +
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};Agora você pode adicionar dois vetores naturalmente:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // Chama v1.operator+(v2)Nem todos os operadores podem ser sobrecarregados. O operador de resolução de escopo ::, acesso a membro ., ternário ?: e sizeof não podem ser sobrecarregados. Além disso, você não pode criar novos operadores ou alterar a precedência de um operador - * sempre será avaliado antes de +.
Operadores podem ser implementados como funções membros (como acima) ou como funções não-membros. Nas próximas lições, você aprenderá quando usar cada abordagem e como sobrecarregar categorias específicas de operadores.
Desafio
FácilVamos construir uma classe Point que representa uma coordenada 2D e suporta a adição de dois pontos usando o operador +. Este é o seu primeiro passo na sobrecarga de operadores — fazendo com que suas classes personalizadas funcionem com operadores familiares.
Você criará dois arquivos para organizar seu código:
Point.h: Defina uma classePointque armazena as coordenadas x e y (ambasint). Sua classe deve ter:- Membros privados para as coordenadas x e y
- Um construtor que recebe os valores x e y
- Getters
getX()egetY()(ambos const) - Um operador
+sobrecarregado que soma dois pontos e retorna um novoPointcom as coordenadas combinadas
O operador
+deve ser implementado como uma função membro que recebe outroPointpor referência constante e retorna um novoPoint. Marque-o comoconst, pois ele não modifica nenhum dos operandos.main.cpp: Leia quatro inteiros da entrada (x1, y1, x2, y2 em linhas separadas) representando dois pontos. Crie dois objetosPoint, some-os usando o operador+e exiba os resultados.Formato de saída:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
A ideia principal aqui é que p1 + p2 está, na verdade, chamando p1.operator+(p2) nos bastidores. Seu operador sobrecarregado permite que você escreva códigos intuitivos como Point p3 = p1 + p2; em vez de algo como Point p3 = p1.add(p2);.
Converta as strings de entrada em inteiros usando std::stoi(). Não se esqueça dos "header guards" em seu arquivo de cabeçalho.
Folha de consulta
A sobrecarga de operadores permite que você defina como operadores como +, - ou == se comportam com classes personalizadas, permitindo uma sintaxe intuitiva como a + b em vez de a.add(b).
Para sobrecarregar um operador, defina uma função usando a palavra-chave operator seguida pelo símbolo:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// Sobrecarga do operador +
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};Uso:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // Chama v1.operator+(v2)Alguns operadores não podem ser sobrecarregados: ::, ., ?: e sizeof. Você não pode criar novos operadores ou alterar a precedência dos operadores.
Os operadores podem ser implementados como funções membros ou funções não membros.
Experimente você mesmo
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// Ler entrada
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: Criar dois objetos Point usando os valores de entrada
// TODO: Somar os dois pontos usando o operador +
// TODO: Exibir os resultados no formato exigido:
// Point 1: (<x1>, <y1>)
// Point 2: (<x2>, <y2>)
// Sum: (<sum_x>, <sum_y>)
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico