Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Определяемые пользователем операторы для управляемых типов разрешены в качестве статических членов, членов экземпляра или на глобальном уровне. Однако только статические операторы доступны через метаданные для клиентов, написанных на языке, отличном от Visual C++.
У ссылочного типа один из параметров статического пользовательского оператора должен быть из следующих:
Дескриптор (
type^) для экземпляра окружающего типа данных.Использование ссылочного типа в виде косвенного обращения (
type^& или type^%) к указателю на экземпляр заключенного типа.
В типе значения один из параметров статического определяемого пользователем оператора должен быть одним из следующих:
Из того же типа, что и вложенный тип значения.
Косвенная ссылка типа указателя (
type^) на окружающий тип.Косвенное использование ссылочного типа (
type% илиtype&) для заключающего типа.Косвенное использование ссылочного типа (
type^% илиtype^&) для дескриптора.
Можно определить следующие операторы:
| Оператор | Унарные или двоичные формы? |
|---|---|
| ! | Унарный |
| != | Бинарный |
| % | Бинарный |
| & | Унарный и бинарный |
| && | Бинарный |
| * | Унарный и бинарный |
| + | Унарный и бинарный |
| ++ | Унарный |
| , | Бинарный |
| - | Унарный и бинарный |
| -- | Унарный |
| -> | Унарный |
| / | Бинарный |
| < | Бинарный |
| << | Бинарный |
| <= | Бинарный |
| = | Бинарный |
| == | Бинарный |
| > | Бинарный |
| >= | Бинарный |
| >> | Бинарный |
| ^ | Бинарный |
| неправда | Унарный |
| правда | Унарный |
| |
Бинарный |
|| |
Бинарный |
| ~ | Унарный |
Пример. Определяемые пользователем операторы
// 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