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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk