共用方式為


追蹤參考運算子 (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]);
}

輸出