Поделиться через


Оператор отслеживания ссылок (расширения компонентов 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 см. в разделах:

8903062a.collapse_all(ru-ru,VS.110).gifПримеры

Пример

В следующем образце показано, как использовать ссылку отслеживания с собственным и управляемыми типами.

// 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