参照演算子の追跡 (C++ コンポーネント拡張)
トラッキング 参照 (%) は、通常のC++の参照 (&) などですが、オブジェクトが追跡参照に代入すると、オブジェクトの参照カウントをインクリメントします。
すべてのプラットフォーム
トラッキング参照には、次の特性があります。
追跡参照のオブジェクトの割り当ては、オブジェクトの参照カウントをインクリメントします。
を逆参照すると、ネイティブ参照& (*) は結果です。^を逆参照するとトラッキング参照 (%) は結果です。&とパーセントの唯一の違いは、「」;&が生の参照であり、%、参照カウント参照であることです。オブジェクトにはできる限り、オブジェクトはメモリのライブなります。
ドット (.) のメンバー アクセス演算子がオブジェクトのメンバーにアクセスするために使用されます。
トラッキング参照がスタックにのみ宣言できます。トラッキング参照は、クラスのメンバーにすることはできません。
トラッキング参照は値型、およびハンドル (たとえば String^) に対して有効です。
トラッキング参照は nullptr のnull値または値を割り当てることはできません。トラッキング参照は別の有効なオブジェクトと同じように何度も要求に応じて再割り当てすることがあります。
トラッキング参照の取得addressは単項演算子として使用できません。
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]);
}
出力