Sobrecarga de operador
A palavra-chave operator declara uma função especificando o que operator-symbol significa quando aplicado às instâncias de uma classe. Isso confere ao operador mais de um significado, ou seja, o "sobrecarrega". O compilador distingue entre os diversos significados de um operador examinando os tipos de seus operandos.
type operator operator-symbol ( parameter-list )
Comentários
Você pode redefinir a função da maioria dos operadores internos globalmente ou em uma classe de cada vez. Os operadores sobrecarregados são implementados como funções.
O nome de um operador sobrecarregado é operatorx, onde x é o operador conforme aparece na tabela a seguir. Por exemplo, para sobrecarregar o operador de adição, você define uma função chamada operator+. Da mesma forma, para sobrecarregar o operador de adição/atribuição, +=, você define uma função chamada operator+=.
Operadores redefiníveis
Operador |
Nome |
Tipo |
---|---|---|
, |
Vírgula |
Binário |
! |
NOT lógico |
Unário |
!= |
Desigualdade |
Binário |
% |
Módulo |
Binário |
%= |
Atribuição de módulo |
Binário |
& |
AND bit a bit |
Binário |
& |
Address-of |
Unário |
&& |
AND lógico |
Binário |
&= |
Atribuição AND de bit a bit |
Binário |
( ) |
Chamada de função |
— |
( ) |
Operador cast |
Unário |
* |
Multiplicação |
Binário |
* |
Desreferência de ponteiro |
Unário |
*= |
Atribuição de multiplicação |
Binário |
+ |
Adição |
Binário |
+ |
Mais unário |
Unário |
++ |
Incremento 1 |
Unário |
+= |
Atribuição de adição |
Binário |
– |
Subtração |
Binário |
– |
Negação unária |
Unário |
–– |
Decremento 1 |
Unário |
–= |
Atribuição de subtração |
Binário |
–> |
Seleção de membro |
Binário |
–>* |
Seleção de ponteiro para membro |
Binário |
/ |
Divisão |
Binário |
/= |
Atribuição de divisão |
Binário |
< |
Menor que |
Binário |
<< |
Shift esquerda |
Binário |
<<= |
Atribuição de deslocamento para a esquerda |
Binário |
<= |
Menor que ou igual a |
Binário |
= |
Atribuição |
Binário |
== |
Igualdade |
Binário |
> |
Maior que |
Binário |
>= |
Maior que ou igual a |
Binário |
>> |
Shift direita |
Binário |
>>= |
Atribuição de deslocamento para a direita |
Binário |
[ ] |
Subscrito de matriz |
— |
^ |
OR exclusivo |
Binário |
^= |
Atribuição de OR exclusivo |
Binário |
| |
OR inclusivo de bit a bit |
Binário |
|= |
Atribuição OR inclusivo de bit a bit |
Binário |
|| |
OR lógico |
Binário |
~ |
Complemento de um |
Unário |
delete |
Delete |
— |
new |
New |
— |
conversion operators |
operadores de conversão |
Unário |
1 Existem duas versões dos operadores unários de incremento e decremento: pré-incremento e pós-incremento.
Consulte o tópico sobre regras gerais do sobrecarregamento de operadores para obter mais informações. As restrições nas diversas categorias de operadores sobrecarregados são descritas nos tópicos a seguir:
Os operadores mostrados na tabela a seguir não podem ser sobrecarregados. A tabela inclui os símbolos de pré-processador # e ##.
Operadores não redefiníveis
Operator |
Name |
. |
Seleção de membro |
.* |
Seleção de ponteiro para membro |
:: |
Resolução do escopo |
? : |
Condicional |
# |
Conversão de pré-processador em cadeia de caracteres |
## |
Concatenação de pré-processador |
Embora, de modo geral, os operadores sobrecarregados sejam chamados implicitamente pelo compilador quando são encontrados no código, eles podem ser invocados explicitamente da mesma maneira que qualquer função de membro ou de não membro é chamada:
Point pt;
pt.operator+( 3 ); // Call addition operator to add 3 to pt.
Exemplo
O exemplo a seguir sobrecarrega o operador + para adicionar dois números complexos e retorna o resultado.
// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct Complex {
Complex( double r, double i ) : re(r), im(i) {}
Complex operator+( Complex &other );
void Display( ) { cout << re << ", " << im << endl; }
private:
double re, im;
};
// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
return Complex( re + other.re, im + other.im );
}
int main() {
Complex a = Complex( 1.2, 3.4 );
Complex b = Complex( 5.6, 7.8 );
Complex c = Complex( 0.0, 0.0 );
c = a + b;
c.Display();
}
Saída
6.8, 11.2