追蹤參考運算子 (C++ 元件擴充功能)
「追蹤參考」(Tracking Reference) (%) 作用如同一般的 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
}
}
Common Language Runtime
繫結至記憶體回收堆積上的 CLR 型別物件時,可使用物件控制代碼的追蹤參考。
在 CLR,當記憶體回收行程移動所參考的物件時,會自動更新追蹤參考變數的值。
在記憶體回收堆積上的物件不可能有原生 C++ 參考。
如需 C++/CLI 追蹤參考的詳細資訊,請參閱:
範例
範例
下列範例示範如何搭配使用追蹤參考與原生和 Managed 型別。
// 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]);
}
輸出