Sobrecarga de Operadores em C++

Publicado por Danilo Renato da Silva em 14/10/2014

[ Hits: 13.597 ]

Blog: http://widgetscomcafe.blogspot.com/

 


Sobrecarga de Operadores em C++



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;
}

Outras dicas deste autor

Desenvolvimento de Lista Encadeada Dinâmica Genérica

Leitura recomendada

Medindo o tempo de execução do seu programa com o gprof

Migrando aplicativos C++ do Windows para Linux

Exemplo prático do uso de C+Assembly

Nemiver - Depurador gráfico (GDB) de C/C++

Usando o pré-processador - básico

  

Comentários
[1] Comentário enviado por vinipsmaker em 15/10/2014 - 03:29h

Recentemente o Stroustroup apresentou sua nova proposta para padronização, sobrecarregar o operador ponto: http://isocpp.org/feeder/?FeederAction=clicked&feed=All+Posts&seed=http%3A%2F%2Fisocpp.org%2...

[2] Comentário enviado por danilo_renato em 15/10/2014 - 10:55h


[1] Comentário enviado por vinipsmaker em 15/10/2014 - 03:29h:

Recentemente o Stroustroup apresentou sua nova proposta para padronização, sobrecarregar o operador ponto: http://isocpp.org/feeder/?FeederAction=clicked&amp;feed=All+Posts&amp;seed=http%3A%2F%2Fisoc....


Parece uma proposta interessante Vinicius, eu não estava por dentro, obrigado pelo toque.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts