추적 참조 연산자(C++ 구성 요소 확장)
추적 참조(%)는 일반 C++ 참조(&)처럼 동작하지만, 예외적으로 개체를 추적 참조에 할당한 경우는 개체 참조 개수가 증가합니다.
모든 플랫폼
추적 참조에는 다음과 같은 특징이 있습니다.
개체를 추적 참조에 할당하면 개체 참조 개수가 증가합니다.
네이티브 참조(&)는 *를 역참조할 경우의 결과입니다. 추적 참조(%)는 ^를 역참조할 경우의 결과입니다. &와 %의 유일한 차이점은 &은 "원시" 참조이고 %는 참조 개수가 계산되는 참조라는 점입니다. 개체에 %가 있을 경우 해당 개체는 메모리에 유지됩니다.
개체 멤버에 액세스하는 데 점(.) 멤버 액세스 연산자가 사용됩니다.
추적 참조는 스택에서만 선언할 수 있습니다. 추적 참조는 클래스의 멤버일 수 없습니다.
추적 참조는 값 형식 및 핸들에만 유효합니다(예: String^).
추적 참조는 null 또는 nullptr 값에 할당할 수 없습니다. 추적 참조는 필요한 횟수만큼 유효한 다른 개체에 다시 할당할 수 있습니다.
추적 참조는 단항 주소 연산자로 사용할 수 없습니다.
Windows 런타임
추적 참조는 참조 개수를 계산하는 표준 C++ 참조처럼 동작합니다. C++ 참조에 대한 자세한 내용은 참조 (C++)를 참조하십시오.
다음 예제는 추적 참조를 사용하여 개체가 가리키는 개체의 내용을 수정하는 방법을 보여 줍니다.
/ZW
using namespace Platform;
int main()
{
array<String^> ^arr = ref new array<String^>(10);
int i = 0;
for(int i = 0; i < 10; ++i){
String^& s = arr[i];
s = i++.ToString(); // changes the array content
}
}
공용 언어 런타임
가비지 수집 힙에서 CLR 형식의 개체에 바인딩할 경우 핸들에 대해 추적 참조를 사용할 수 있습니다.
CLR에서는 가비지 수집기가 참조 개체를 이동할 때마다 추적 참조 변수의 값이 자동으로 업데이트됩니다.
가비지 수집 힙에서는 개체에 대한 네이티브 C++ 참조를 사용할 수 없습니다.
C++/CLI의 추적 참조에 대한 자세한 내용은 다음을 참조하십시오.
예제
예제
다음 샘플은 네이티브 및 관리되는 형식을 사용하여 추적 참조를 사용하는 방법을 보여 줍니다.
// tracking_reference_1.cpp
// compile with: /clr
ref class MyClass {
public:
int i;
};
value struct MyStruct {
int k;
};
int main() {
MyClass ^ x = ref new MyClass;
MyClass ^% y = x; // tracking reference handle to reference object
int %ti = x->i; // tracking reference to member of reference type
int j = 0;
int %tj = j; // tracking reference to object on the stack
int * pi = new int[2];
int % ti2 = pi[0]; // tracking reference to object on native heap
int *% tpi = pi; // tracking reference to native pointer
MyStruct ^ x2 = ref new MyStruct;
MyStruct ^% y2 = x2; // tracking reference to value object
MyStruct z;
int %tk = z.k; // tracking reference to member of value type
delete[] pi;
}
예제
다음 샘플은 배열에 추적 참조를 바인딩하는 방법을 보여 줍니다.
// tracking_reference_2.cpp
// compile with: /clr
using namespace System;
int main() {
array<int> ^ a = ref new array< Int32 >(5);
a[0] = 21;
Console::WriteLine(a[0]);
array<int> ^% arr = a;
arr[0] = 222;
Console::WriteLine(a[0]);
}
Output