Оператор отслеживания ссылок (расширения компонентов C++)
Ссылка отслеживания (%) ведет себя как обычная справочник по языку C++ (&), за исключением того, что, когда объект присвоить ссылке отслеживания, счетчик ссылок объекта увеличивается.
Все платформы
Ссылка отслеживания имеет следующие характеристики.
Назначение объекта на ссылку отслеживания вызывает счетчика ссылок объекта, инкрементированным.
Собственную ссылку (&) результат при разыменуете a *.Ссылка отслеживания (%) результат при разыменуете ^.Единственное различие заключается в том, что и & % & ", где" справочник по себе, % ссылка- подсчитанная ссылка.При наличии % к объекту, объект останется в активном состоянии в памяти.
Оператор участник- доступа с многоточием (.) используется для доступа к члену объекта.
Ссылка отслеживания можно объявлять только в стеке.Ссылка отслеживания не может быть членом класса.
Ссылки отслеживания, допустимые для типов значений и маркеров (например 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 на мусор- собранной куче.
Среды CLR, значение переменной ссылки отслеживания обновлено автоматически, когда сборщик мусора переместит объект, на который ссылаются.
Невозможно иметь собственную ссылку на объект в мусор- C++ собранной куче.
Дополнительные сведения о ссылках отслеживания в C++/CLI см. в разделах:
Как Передайте типы среды CLR ссылкой со ссылками отслеживания
Как Функции шаблона записи, которые принимают собственные, значение или ссылочные параметры
Примеры
Пример
В следующем образце показано, как использовать ссылку отслеживания с собственным и управляемыми типами.
// 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