Bagikan melalui


Operator yang Ditentukan Pengguna (C++/CLI)

Operator yang ditentukan pengguna untuk jenis terkelola diizinkan sebagai anggota statis atau anggota instans, atau pada cakupan global. Namun, hanya operator statis yang dapat diakses melalui metadata ke klien yang ditulis dalam bahasa selain Visual C++.

Dalam jenis referensi, salah satu parameter operator statis yang ditentukan pengguna harus salah satunya:

  • Handel (type ^) ke instans tipe pembungkus.

  • Tipe referensi tidak langsung (type^& atau tipe^%) ke handle ke instance tipe pembungkus.

Dalam jenis nilai, salah satu parameter operator statis yang ditentukan pengguna harus salah satunya:

  • Dengan jenis yang sama dengan tipe nilai yang melingkupi.

  • Tipe penunjuk tidak langsung (type^) ke jenis penutup.

  • Tipe referensi tidak langsung (type% atau type&) ke jenis penutup.

  • Indireksi tipe referensi (type^% atau type^&) ke handle.

Anda dapat menentukan operator berikut:

Pengoperasi Bentuk Unary/Binary?
! Unari
!= Biner
% Biner
& Unary dan Biner
&& Biner
* Unary dan Biner
+ Unary dan Biner
++ Unari
, Biner
- Unary dan Biner
-- Unari
-> Unari
/ Biner
< Biner
<< Biner
<= Biner
= Biner
== Biner
> Biner
>= Biner
>> Biner
^ Biner
salah Unari
benar Unari
| Biner
|| Biner
~ Unari

Contoh: Operator yang ditentukan pengguna

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

Contoh: Sintesis operator

Sampel berikut menunjukkan sintesis operator, yang hanya tersedia saat Anda menggunakan /clr untuk mengkompilasi. Sintesis operator menciptakan bentuk penugasan untuk operator biner, jika belum ada bentuk yang ditentukan, di mana sisi kiri dari operator penugasan memiliki tipe 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

Lihat juga

Kelas dan Struktur