next up previous contents
Next: Amizade Up: Encapsulação Previous: Alocação dinâmica de objetos   Sumário


Sobrecarga de operadores

Já foi discutido no capítulo anterior a questão da sobrecarga de nomes de funções. As mesmas regras se aplicam quando as funções sobrecarregadas são membros de uma classe -- mesmo no caso de construtores.

Com relação a classes, há um aspecto muito relacionado à sobrecarga de funções -- é a sobrecarga de operadores. Em outras palavras, é possível definir os símbolos usuais de operadores -- tais como +, * ou << -- de forma a associá-los com métodos definidos para a classe.

A forma de implementar esta característica é através da definição de uma função operador. Uma função operador é geralmente uma função membro da classe. (Caso não o seja, ela deve ser uma função amiga, como explicado na próxima seção.) A declaração de uma função operador é da forma

tipo-de-retorno nome-da-classe
:: operator#
(lista-arg);
onde # é substituído pelo operador que irá ser sobrecarregado.

Por exemplo, suponha que uma classe de nome loc seja definida com dois dados privativos, longitude e latitude. Um operador de adição para esta classe poderia ser definido como

loc loc::operator+(loc op2) {
loc temp;

temp.longitude = op2.longitude + longitude;
temp.latitude = op2.latitude + latitude;
return temp;
};

A forma de uso para este operador seria então

loc loc1, loc2, newloc;
...
newloc = loc1 + loc2;

Observe que operator+() tem apenas um parâmetro, mesmo sobrecarregando um operador binário (+). O que ocorre é que o parâmetro do lado esquerdo do sinal + é passado implicitamente para a função operador usando o apontador this. O operando do lado direito é passado como o parâmetro op2. O fato de que o operando do lado esquerdo é passado usando this tem uma implicação importante: quando operadores binários são sobrecarregados, é o objeto à esquerda que gera a chamada para a função operador.

É importante notar que novos operadores não podem ser criados -- apenas aqueles que existem podem ser sobrecarregados por uma classe. Do mesmo modo, a precedência de um operador não pode ser modificada.


next up previous contents
Next: Amizade Up: Encapsulação Previous: Alocação dinâmica de objetos   Sumário
Ivan Luiz Marques Ricarte 2001-06-01