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
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.