C ++

Sobrecarga em C ++

Sobrecarga em C ++
C ++ não permite uma função que adiciona dois inteiros e retorna um inteiro, para adicionar dois flutuantes e retornar um flutuante. Imagine que existe uma função para adicionar dois inteiros e retornar um inteiro. Não seria bom ter outra função com o mesmo nome, que adiciona apenas dois ou mais floats para retornar um float? Isso significa sobrecarregar a primeira função.

Operadores aritméticos são normalmente usados ​​para operações aritméticas. Não é bom ter o +, juntar duas strings? Ativar isso está sobrecarregando o operador de adição aritmética, para strings.

O operador de incremento, ++ adiciona 1 a um int ou a um float. Ao lidar com ponteiros, ele não adiciona 1 ao ponteiro. Faz o ponteiro apontar para o próximo objeto consecutivo na memória. Um iterador aponta para o próximo objeto em uma lista vinculada, mas os objetos da lista vinculada estão em lugares diferentes na memória (não em regiões consecutivas). Não seria bom sobrecarregar o operador de incremento de um iterador para incrementar, mas apontar para o seguinte elemento, na lista vinculada?

Este artigo explica a sobrecarga em C++. É dividido em duas partes: sobrecarga de função e sobrecarga do operador. Já ter conhecimento básico em C ++ é necessário para entender o resto do artigo.

Conteúdo do Artigo

Sobrecarga de função

A função a seguir adiciona dois ints e retorna um int:

int add (int no1, int no2)

soma int = no1 + no2;
soma de retorno;

O protótipo desta função é:
int add (int no1, int no2);
O protótipo de uma função no cabeçalho da função, terminando com um ponto e vírgula. A seguinte função com o mesmo nome, mas com um protótipo diferente, adicionaria três flutuadores e retornaria um flutuante:
float add (float no1, float no2, float no3)

soma flutuante = no1 + no2 + no3;
soma de retorno;

Como o compilador diferencia qual função chamar, já que duas ou mais funções têm o mesmo nome? O compilador usa o número de argumentos e tipos de argumento para determinar qual função chamar. A lista de parâmetros de funções sobrecarregadas deve diferir em seu número e / ou tipos de parâmetros. Então, a chamada de função,

int sm = adicionar (2, 3);

chamaria a função inteira, enquanto a função chamaria,

float sme = add (2.3, 3.4, 2.0);

chamaria a função float. Nota: existem situações em que o compilador rejeitará uma função sobrecarregada quando o número de argumentos é o mesmo, mas de tipos diferentes! - Motivo: - veja mais tarde.

O programa a seguir coloca os segmentos de código acima em ação:

#incluir
usando namespace std;
int add (int no1, int no2)

soma int = no1 + no2;
soma de retorno;

float add (float no1, float no2, float no3)

soma flutuante = no1 + no2 + no3;
soma de retorno;

int main ()

int sm = adicionar (2, 3);
cout<float sme = add (2.3, 3.4, 2.0);
cout<return 0;

O resultado é:
5
7.7

Sobrecarga do operador

Operadores aritméticos são usados ​​para sobrecarregar operações em tipos de classe. Um iterador é um tipo de classe. Os operadores de incremento e decremento são usados ​​para sobrecarregar as operações de um iterador.

Sobrecarga de operador de classe de string de exemplo

Esta seção fornece um exemplo, onde + é sobrecarregado para uma classe de string projetada de forma simples, chamada de classe spring. + concatena os literais de dois objetos de string, retornando um novo objeto com os literais concatenados. Concatenar dois literais significa juntar o segundo literal ao final do primeiro literal.

Agora, C ++ tem uma função de membro especial para todas as classes, chamada de operador. O programador pode usar esta função especial para sobrecarregar operadores, como +. O programa a seguir mostra a sobrecarga do operador + para duas strings.

#incluir
usando namespace std;
aula de primavera

público:
// membros de dados
char val [100];
int n;
char concat [100];
// funções de membro
primavera (char arr [])

para (int i = 0; i<100; ++i)
val [i] = arr [i];
if (arr [i] == '\ 0')
pausa;

int i;
para (i = 0; i<100; ++i) if (arr[i] == '\0') break;
n = i;

operador de mola + (primavera e st)
int newLen = n + st.n;
char newStr [newLen + 1];
para (int i = 0; ipara (int i = n; inewStr [newLen] = '\ 0';
spring obj (newStr);
return obj;

;
int main ()

char ch1 [] = "Eu te odeio! "; mola str1 (ch1);
char ch2 [] = "Mas ela te ama!"; mola str2 (ch2);
char ch3 [] = "um"; mola str3 (ch3);
str3 = str1 + str2;
cout<return 0;

O valor de str1 é "Eu te odeio! ". O valor de str2 é "Mas ela te ama!". O valor de str3, que é, str1 + str2, é a saída:

"Te odeio! Mas ela te ama!"

que é a concatenação dos dois literais de string. As próprias strings são objetos instanciados.

A definição da função do operador está dentro da descrição (definição) da classe string. Começa com o tipo de retorno, "mola" para "string". O nome especial, "operador, siga este". Depois disso, vem o símbolo do operador (estar sobrecarregado). Depois, há a lista de parâmetros, que é na verdade a lista de operandos. + é um operador binário: o que significa que leva um operando à esquerda e à direita. No entanto, pela especificação C ++, a lista de parâmetros aqui tem apenas o parâmetro correto. Depois, há o corpo da função do operador, que imita o comportamento normal do operador.

Pela especificação C ++, a definição do operador + leva apenas o parâmetro do operando direito, porque o resto da descrição da classe é o parâmetro do operando esquerdo.

No código acima, apenas a definição da função operador + () está preocupada com a sobrecarga de +. O resto do código da classe é uma codificação normal. Dentro desta definição, os dois literais de string são concatenados na matriz, newStr []. Depois disso, um novo objeto string é realmente criado (instanciado), usando um argumento, newStr []. No final da definição da função operador + (), o objeto recém-criado, tendo a string concatenada, é retornado.

Na função main (), a adição é feita pela instrução:

str3 = str1 + str2;

Onde str1, str2 e str3 são objetos string que já foram criados em main (). A expressão, "str1 + str2" com seu +, chama a função de membro operador + () no objeto str1. A função de membro operador + () no objeto str1 usa str2 como seu argumento e retorna o novo objeto com (desenvolvida) a string concatenada. O operador de atribuição (=) da instrução completa, substitui o conteúdo (valores das variáveis) do objeto str3, pelos do objeto retornado. Na função main (), após a adição, o valor do membro de dados str3.val não é mais "um"; é a string concatenada (adição), "Eu te odeio! Mas ela te ama!". A função de membro operador + () no objeto str1 usa o literal de string de seu próprio objeto e o literal de string de seu argumento str2 para obter um literal de string unido.

Sobrecarga do operador do iterador

Ao lidar com o iterador, pelo menos dois objetos estão envolvidos: uma lista vinculada e o próprio iterador. Na verdade, pelo menos duas classes estão envolvidas: uma classe da qual uma lista vinculada é instanciada e uma classe da qual um iterador é instanciado.

Lista vinculada

Um diagrama para um objeto de lista duplamente vinculada é:

Esta lista tem três elementos, mas pode haver mais. Os três elementos aqui são elementos de inteiros. O primeiro tem o valor 14; o próximo tem o valor, 88; e o último tem o valor, 47. Cada elemento aqui consiste em três locais consecutivos.

Isso é diferente da matriz, onde cada elemento é um local e todos os elementos da matriz estão em locais consecutivos. Aqui, os diferentes elementos estão em lugares diferentes na série de memória, mas cada elemento consiste em três locais consecutivos.

Para cada elemento, a localização do meio contém o valor. O local certo contém o ponteiro para o próximo elemento. A localização à esquerda tem o ponteiro para o elemento anterior. Para o último elemento, a localização certa aponta para um fim teórico da lista. Para o primeiro elemento, a localização esquerda aponta para um início teórico da lista.

Com a matriz, o operador de incremento (++), incrementa o ponteiro para apontar para o próximo local fisicamente. Com a lista, os elementos não estão em regiões consecutivas na memória. Portanto, o operador de incremento pode ser sobrecarregado, mova o iterador (ponteiro) de um elemento para o próximo elemento logicamente. A mesma projeção se aplica ao operador de decremento (-).

Um iterador direto é um iterador que, quando ativado, aponta para o próximo elemento. Um iterador reverso é um iterador que, quando ativado, aponta para o elemento anterior.

Sobrecarregando ++ anúncio -

A sobrecarga desses operadores é feita na descrição da classe (definição) do iterador.

A sintaxe para o protótipo da sobrecarga do operador de incremento, prefixo, é

Operador ReturnType ++ ();

A sintaxe para o protótipo da sobrecarga do operador de incremento, postfix, é

Operador ReturnType ++ (int);

A sintaxe para o protótipo da sobrecarga do operador de decremento, prefixo, é

Operador ReturnType - ();

A sintaxe para o protótipo da sobrecarga do operador de incremento, postfix, é

Operador ReturnType - (int);

Conclusão

Sobrecarga significa dar um significado diferente a uma função ou operador. As funções estão sobrecarregadas no mesmo escopo. O que diferencia as funções sobrecarregadas são o número e / ou tipos de parâmetros em suas listas de parâmetros. Em alguns casos, onde o número de parâmetros é o mesmo, mas com tipos diferentes, o compilador rejeita a sobrecarga - veja mais tarde. Muitos operadores comuns podem ser sobrecarregados em classes a partir das quais os objetos são instanciados. Isso é feito fornecendo um tipo de retorno, lista de parâmetros e corpo para a função especial chamada operador, na descrição da classe.

Mecanismos de jogos gratuitos e de código aberto para o desenvolvimento de jogos Linux
Este artigo cobrirá uma lista de mecanismos de jogo gratuitos e de código aberto que podem ser usados ​​para desenvolver jogos 2D e 3D no Linux. Exist...
Tutorial de Shadow of the Tomb Raider para Linux
Shadow of the Tomb Raider é a décima segunda adição à série Tomb Raider - uma franquia de jogos de ação e aventura criada pela Eidos Montreal. O jogo ...
Como aumentar o FPS no Linux?
FPS significa Quadros por segundo. A tarefa do FPS é medir a taxa de quadros em reproduções de vídeo ou desempenho de jogos. Em palavras simples, o nú...