사용자 정의 연산자(C++/CLI)
관리되는 형식에 대한 사용자 정의 연산자는 정적 멤버 또는 인스턴스 멤버 또는 전역 범위에서 허용됩니다. 그러나 Visual C++가 아닌 언어로 작성된 클라이언트에 대한 메타데이터를 통해 정적 연산자만 액세스할 수 있습니다.
참조 형식에서 정적 사용자 정의 연산자의 매개 변수 중 하나는 다음 중 하나여야 합니다.
바깥쪽 형식의 인스턴스에 대한 핸들(
type
^)입니다.바깥쪽 형식의 인스턴스에 대한 핸들에 대한 참조 형식 간접 참조(
type
^> 또는 type^%)입니다.
값 형식에서 정적 사용자 정의 연산자의 매개 변수 중 하나는 다음 중 하나여야 합니다.
바깥쪽 값 형식과 동일한 형식입니다.
바깥쪽 형식에 대한 포인터 형식 간접 참조(
type
^)입니다.바깥쪽 형식에 대한 참조 형식 간접 참조(
type
% 또는type
>)입니다.핸들에 대한 참조 형식 간접 참조(
type
^% 또는type
^&>)입니다.
다음 연산자를 정의할 수 있습니다.
연산자 | 단항/이진 양식? |
---|---|
! | 단항 |
!= | 이진 |
% | 이진 |
& | 단항 및 이항 |
&& | 이진 |
* | 단항 및 이항 |
+ | 단항 및 이항 |
++ | 단항 |
, | 이진 |
- | 단항 및 이항 |
-- | 단항 |
-> | 단항 |
/ | 이진 |
< | 이진 |
<< | 이진 |
<= | 이진 |
= | 이진 |
== | 이진 |
> | 이진 |
>= | 이진 |
>> | 이진 |
^ | 이진 |
false | 단항 |
true | 단항 |
| |
이진 |
|| |
이진 |
~ | 단항 |
예: 사용자 정의 연산자
// 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