Operadores definidos pelo usuário (C++/CLI)
Os operadores definidos pelo usuário para tipos gerenciados são permitidos como membros estáticos ou membros de instância ou no escopo global. No entanto, somente operadores estáticos são acessíveis por meio de metadados para clientes escritos em um idioma diferente do Visual C++.
Em um tipo de referência, um dos parâmetros de um operador estático definido pelo usuário precisa ser um destes:
Um identificador (
type
^) para uma instância do tipo delimitador.Uma indireção de tipo de referência (
type
^& ou type^%) para um identificador para uma instância do tipo delimitador.
Em um tipo de valor, um dos parâmetros de um operador estático definido pelo usuário precisa ser um destes:
Do mesmo tipo que o tipo de valor delimitador.
Um indireção de tipo de ponteiro (
type
^) para o tipo delimitador.Uma indireção do tipo de referência (
type
% outype
&) para o tipo delimitador.Uma indireção de tipo de referência (
type
^% outype
^&) para o identificador.
Você pode definir os seguintes operadores:
Operador | Formas uniárias/binárias? |
---|---|
! | Unário |
!= | Binário |
% | Binário |
& | Unário e Binário |
&& | Binário |
* | Unário e Binário |
+ | Unário e Binário |
++ | Unário |
, | Binário |
- | Unário e Binário |
-- | Unário |
-> | Unário |
/ | Binário |
< | Binário |
<< | Binário |
<= | Binário |
= | Binário |
== | Binário |
> | Binário |
>= | Binário |
>> | Binário |
^ | Binário |
false | Unário |
true | Unário |
| |
Binário |
|| |
Binário |
~ | Unário |
Exemplo: operadores definidos pelo usuário
// mcppv2_user-defined_operators.cpp
// compile with: /clr
using namespace System;
public ref struct X {
X(int i) : m_i(i) {}
X() {}
int m_i;
// static, binary, user-defined operator
static X ^ operator + (X^ me, int i) {
return (gcnew X(me -> m_i + i));
}
// instance, binary, user-defined operator
X^ operator -( int i ) {
return gcnew X(this->m_i - i);
}
// instance, unary, user-defined pre-increment operator
X^ operator ++() {
return gcnew X(this->m_i++);
}
// instance, unary, user-defined post-increment operator
X^ operator ++(int i) {
return gcnew X(this->m_i++);
}
// static, unary user-defined pre- and post-increment operator
static X^ operator-- (X^ me) {
return (gcnew X(me -> m_i - 1));
}
};
int main() {
X ^hX = gcnew X(-5);
System::Console::WriteLine(hX -> m_i);
hX = hX + 1;
System::Console::WriteLine(hX -> m_i);
hX = hX - (-1);
System::Console::WriteLine(hX -> m_i);
++hX;
System::Console::WriteLine(hX -> m_i);
hX++;
System::Console::WriteLine(hX -> m_i);
hX--;
System::Console::WriteLine(hX -> m_i);
--hX;
System::Console::WriteLine(hX -> m_i);
}
-5
-4
-3
-2
-1
-2
-3
Exemplo: Síntese do operador
O exemplo a seguir demonstra a síntese do operador, que só está disponível quando você usa /clr para compilar. A síntese do operador cria a forma de atribuição de um operador binário, se não for definida, em que o lado esquerdo do operador de atribuição tem um tipo CLR.
// mcppv2_user-defined_operators_2.cpp
// compile with: /clr
ref struct A {
A(int n) : m_n(n) {};
static A^ operator + (A^ r1, A^ r2) {
return gcnew A( r1->m_n + r2->m_n);
};
int m_n;
};
int main() {
A^ a1 = gcnew A(10);
A^ a2 = gcnew A(20);
a1 += a2; // a1 = a1 + a2 += not defined in source
System::Console::WriteLine(a1->m_n);
}
30