Share via


Operator Referensi Pelacakan (C++/CLI dan C++/CX)

Referensi pelacakan (%) bersifat seperti referensi C++ biasa (&) kecuali bahwa ketika objek ditetapkan ke referensi pelacakan, jumlah referensi objek bertambah.

Semua Platform

Referensi pelacakan memiliki karakteristik berikut.

  • Penetapan objek ke referensi pelacakan menyebabkan jumlah referensi objek bertambah.

  • Referensi asli (&) adalah hasil ketika Anda mendereferensikan *. Referensi pelacakan (%) adalah hasil saat Anda mendereferensikan ^. Selama Anda memiliki % ke objek, objek akan tetap hidup dalam memori.

  • Operator akses anggota titik (.) digunakan untuk mengakses anggota objek.

  • Referensi pelacakan valid untuk jenis dan handel nilai (misalnya String^).

  • Referensi pelacakan tidak dapat ditetapkan null atau nullptr nilai. Referensi pelacakan dapat ditetapkan ulang ke objek lain yang valid sebanyak yang diperlukan.

  • Referensi pelacakan tidak dapat digunakan sebagai operator alamat ambil tidak sah.

Windows Runtime

Referensi pelacakan bersifat seperti referensi C++ standar, kecuali bahwa % dihitung referensi. Cuplikan berikut menunjukkan cara mengonversi antara % dan ^ jenis:

Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;

Contoh berikut menunjukkan cara meneruskan ^ ke fungsi yang mengambil %.

ref class Foo sealed {};

    // internal or private
    void UseFooHelper(Foo% f)
    {
        auto x = %f;
    }

    // public method on ABI boundary
    void UseFoo(Foo^ f)
    {
        if (f != nullptr) { UseFooHelper(*f); }
    }

Runtime Bahasa Umum

Di C++/CLI, Anda dapat menggunakan referensi pelacakan ke handel saat Anda mengikat objek jenis CLR pada tumpukan yang dikumpulkan sampah.

Di CLR, nilai variabel referensi pelacakan diperbarui secara otomatis setiap kali pengumpul sampah memindahkan objek yang dirujuk.

Referensi pelacakan hanya dapat dideklarasikan pada tumpukan. Referensi pelacakan tidak boleh menjadi anggota kelas.

Tidak dimungkinkan untuk memiliki referensi C++ asli ke objek pada tumpukan yang dikumpulkan sampah.

Untuk informasi selengkapnya tentang referensi pelacakan di C++/CLI, lihat:

Contoh

Sampel berikut untuk C++/CLI menunjukkan cara menggunakan referensi pelacakan dengan jenis asli dan terkelola.

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

Sampel berikut untuk C++/CLI memperlihatkan cara mengikat referensi pelacakan ke array.

// 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]);
}
21
222