Пользовательские операторы (C++/CLI)

Определяемые пользователем операторы для управляемых типов разрешены как статические члены или члены экземпляра или глобальные область. Однако только статические операторы доступны через метаданные для клиентов, написанных на языке, отличном от Visual C++.

В ссылочного типа один из параметров статического определяемого пользователем оператора должен быть одним из следующих:

  • Дескриптор (type ^) для экземпляра заключенного типа.

  • Косвенное использование ссылочного типа (type^& или type^%) к дескриптору экземпляра заключенного типа.

В типе значения один из параметров статического определяемого пользователем оператора должен быть одним из следующих:

  • Из того же типа, что и вложенный тип значения.

  • Оповещание типа указателя (type^) к заключенному типу.

  • Косвенное использование ссылочного типа (type% или type&) для заключающего типа.

  • Косвенное использование ссылочного типа (type^% или type^&) для дескриптора.

Можно определить следующие операторы:

Оператор Унарные или двоичные формы?
! Унарный
!= Binary
% Binary
& Унарный и бинарный
&& Binary
* Унарный и бинарный
+ Унарный и бинарный
++ Унарный
, Binary
- Унарный и бинарный
-- Унарный
-> Унарный
/ Binary
< Binary
<< Binary
<= Binary
= Binary
== Binary
> Binary
>= Binary
>> Binary
^ Binary
false Унарный
true Унарный
| Binary
|| Binary
~ Унарный

Пример. Определяемые пользователем операторы

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

Пример. Синтез оператора

В следующем примере демонстрируется синтез оператора, который доступен только при использовании /clr для компиляции. Синтез оператора создает форму назначения двоичного оператора, если она не определена, где левая сторона оператора назначения имеет тип 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

См. также

Классы и структуры