Introdução
A sobrecarga de operadores é um recurso poderoso da linguagem
C++, que permite a possibilidade de definir como os operadores padrão da linguagem (+, =, *, etc) operam em tipos definidos por nós (classes).
Com a sobrecarga de operadores, é possível sobrecarregar o comportamento de determinado operador, ou seja, fazer com que ele tenha um comportamento diferente do padrão, tornado possível a expansão da capacidade destes operadores para além da utilização com os tipos primitivos da linguagem (int, float, etc).
Desta forma, por exemplo, é possível fazer com que o operador "+", que normalmente é utilizado para efetuar a soma entre dois tipos primitivos numéricos, tenha um comportamento diferente, que antes de sua sobrecarga não seria possível, nos objetos definidos através de nossas novas classes.
A sobrecarga de operadores não implica na perda da funcionalidade que este já possuía, mas sim, na adição de uma nova funcionalidade sobre objetos de classes.
Um caso de uso
Para efeito de demonstração, definiremos uma classe chamada
String, que terá como atributo uma cadeia de caracteres, e através da sobrecarga de operadores, realizará algumas operações sobre esta cadeia de caracteres.
É importante notar, que esta é uma classe simples, que tem como principal objetivo, demonstrar o conceito da sobrecarga de operadores de forma prática.
Faremos a sobrecarga dos seguintes operadores:
- + → para concatenação de strings;
- [] → para retornar um caractere em determinado índice na string;
- * → para "clonar" a mesma cadeia de caracteres determinado número de vezes.
Código fonte:
#include <iostream>
#include <string.h>
using namespace std;
class String
{
private:
// cadeia de caracteres encapsulada pela classe
const char* caracteres;
public:
//construtor que recebe uma cadeia de caracteres
String(const char* caracteres)
{
this->caracteres = caracteres;
}
//construtor que não recebe parâmetros
String()
{
this->caracteres = "";
}
//operador de concatenação
String& operator + (const String& s)
{
int tamS1 = strlen(this->caracteres);
int tamS2 = strlen(s.caracteres);
char* caracteres = new char[tamS1 + tamS2];
strcpy(caracteres, this->caracteres);
strcat(caracteres, s.caracteres);
String* nova = new String(caracteres);
return *nova;
}
//operador para retornar caracter em determinado índice
char operator [] (int indice)
{
return this->caracteres[indice];
}
//operador para 'clonar' a string
String& operator * (int x)
{
int tam = strlen(this->caracteres) * x;
char* caracteres = new char[tam];
for(int i = 0; i < x; i++)
{
strcat(caracteres, this->caracteres);
}
String* nova = new String(caracteres);
return *nova;
}
//método para mostrar os caracteres da string
void mostra()
{
cout << this->caracteres;
}
};
// EXEMPLO DE USO
int main()
{
String s1 = "sobrecarga ";
String s2 = "de ";
String s3 = "operador";
String s4 = s1 + s2 + s3;
s4.mostra();
char c = s4[11];
cout << "\n" << c;
s4 = s2 * 7;
cout << "\n";
s4.mostra();
return 0;
}