Benutzerdefinierte Operatoren (C++/CLI)

 

Veröffentlicht: Juli 2016

Die neueste Dokumentation zu Visual Studio 2017 finden Sie unter Dokumentation zu Visual Studio 2017.

Benutzerdefinierte Operatoren für verwaltete Typen werden als statische Member kann oder Member oder im globalen Gültigkeitsbereich als Instanz zurückgibt. jedoch nur statische Operatoren sind durch Metadaten für Clients verfügbar, die in eine andere Sprache als Visual C++ geschrieben sein.

In einem Verweistyp muss einer der Parameter einer statischen benutzerdefinierten Operators einem dieser sein:

  • Ein Handle (^type ) zu einer Instanz des einschließenden Typs.

  • Eine Verweistypdereferenzierung (type oder type^% ^& ) zu einem Handle einer Instanz des einschließenden Typs.

In einen Werttyp muss einer der Parameter einer statischen benutzerdefinierten Operators einem dieser sein:

  • im selben Typ wie der einschließende Werttyp.

  • Eine type Zeigertypdereferenzierung (^) dem einschließenden Typ.

  • Eine Verweistypdereferenzierung % (type oder type&) auf den einschließenden Typ.

  • Eine Verweistypdereferenzierung (type oder type^% ^&) in Anspruch.

Sie können die folgenden Operatoren definieren:

OperatorUnär/binäre Formen?
!Unär
!=Binär
%Binär
&Unär und binär
&&Binär
*Unär und binär
+Unär und binär
++Unär
,Binär
-Unär und binär
--Unär
->Unär
/Binär
<Binär
<<Binär
<=Binär
=Binär
==Binär
>Binär
>=Binär
>>Binär
^Binär
falseUnär
trueUnär
|Binär
||Binär
~Unär
// 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

Im folgenden Beispiel wird Operatorsynthese, die nur verfügbar ist, wenn Sie /clr verwenden, um zu kompilieren. Operatorsynthese erstellt das Abtretungsformular eines binären Operators, wenn nicht definiert ist, wobei die linke Seite des Zuweisungsoperators einen CLR-Typ hat.

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

Classes and Structs

Anzeigen: