nullptr (C++/CLI dan C++/CX)
Kata nullptr
kunci mewakili nilai pointer null. Gunakan nilai penunjuk null untuk menunjukkan bahwa gagang objek, penunjuk interior, atau jenis penunjuk asli tidak menunjuk ke objek.
Gunakan nullptr
dengan kode terkelola atau asli. Pengkompilasi memancarkan instruksi yang sesuai tetapi berbeda untuk nilai pointer null terkelola dan asli. Untuk informasi tentang menggunakan versi C++ standar ISO dari kata kunci ini, lihat nullptr.
Kata kunci __nullptr adalah kata kunci khusus Microsoft yang memiliki arti yang sama dengan nullptr
, tetapi hanya berlaku untuk kode asli. Jika Anda menggunakan nullptr
dengan kode C/C++ asli lalu mengkompilasi dengan opsi /clr compiler, pengkompilasi tidak dapat menentukan apakah nullptr
menunjukkan nilai pointer null asli atau terkelola. Untuk memperjelas niat Anda kepada pengkompilasi, gunakan nullptr
untuk menentukan nilai terkelola atau __nullptr untuk menentukan nilai asli.
Kata nullptr
kunci setara dengan Tidak Ada di Visual Basic dan null di C#.
Penggunaan
Kata nullptr
kunci dapat digunakan di mana saja handel, penunjuk asli, atau argumen fungsi dapat digunakan.
Kata nullptr
kunci bukan jenis dan tidak didukung untuk digunakan dengan:
throw nullptr
(meskipunthrow (Object^)nullptr;
akan bekerja)
Kata nullptr
kunci dapat digunakan dalam inisialisasi jenis pointer berikut:
Penunjuk asli
Handel Windows Runtime
Handel terkelola
Penunjuk interior terkelola
Kata nullptr
kunci dapat digunakan untuk menguji apakah referensi pointer atau handle null sebelum referensi digunakan.
Panggilan fungsi di antara bahasa yang menggunakan nilai pointer null untuk pemeriksaan kesalahan harus ditafsirkan dengan benar.
Anda tidak dapat menginisialisasi handel ke nol; hanya nullptr
dapat digunakan. Penugasan konstanta 0 ke handel objek menghasilkan kotak Int32
dan cast ke Object^
.
Contoh: nullptr
kata kunci
Contoh kode berikut menunjukkan bahwa nullptr
kata kunci dapat digunakan di mana pun handel, penunjuk asli, atau argumen fungsi dapat digunakan. Dan contoh menunjukkan bahwa nullptr
kata kunci dapat digunakan untuk memeriksa referensi sebelum digunakan.
// mcpp_nullptr.cpp
// compile with: /clr
value class V {};
ref class G {};
void f(System::Object ^) {}
int main() {
// Native pointer.
int *pN = nullptr;
// Managed handle.
G ^pG = nullptr;
V ^pV1 = nullptr;
// Managed interior pointer.
interior_ptr<V> pV2 = nullptr;
// Reference checking before using a pointer.
if (pN == nullptr) {}
if (pG == nullptr) {}
if (pV1 == nullptr) {}
if (pV2 == nullptr) {}
// nullptr can be used as a function argument.
f(nullptr); // calls f(System::Object ^)
}
Contoh: Gunakan nullptr
dan nol secara bergantian
Contoh kode berikut menunjukkan bahwa nullptr
dan nol dapat digunakan secara bergantian pada pointer asli.
// mcpp_nullptr_1.cpp
// compile with: /clr
class MyClass {
public:
int i;
};
int main() {
MyClass * pMyClass = nullptr;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");
if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");
pMyClass = 0;
if ( pMyClass == nullptr)
System::Console::WriteLine("pMyClass == nullptr");
if ( pMyClass == 0)
System::Console::WriteLine("pMyClass == 0");
}
pMyClass == nullptr
pMyClass == 0
pMyClass == nullptr
pMyClass == 0
Contoh: Menginterpretasikan nullptr
sebagai handel
Contoh kode berikut menunjukkan bahwa nullptr
ditafsirkan sebagai handel ke jenis apa pun atau penunjuk asli ke jenis apa pun. Jika fungsi kelebihan beban dengan handel ke berbagai jenis, kesalahan ambiguitas akan dihasilkan. Harus nullptr
secara eksplisit dilemparkan ke jenis .
// mcpp_nullptr_2.cpp
// compile with: /clr /LD
void f(int *){}
void f(int ^){}
void f_null() {
f(nullptr); // C2668
// try one of the following lines instead
f((int *) nullptr);
f((int ^) nullptr);
}
Contoh: Cast nullptr
Contoh kode berikut menunjukkan bahwa transmisi nullptr
diizinkan dan mengembalikan pointer atau handel ke jenis cast yang berisi nullptr
nilai .
// mcpp_nullptr_3.cpp
// compile with: /clr /LD
using namespace System;
template <typename T>
void f(T) {} // C2036 cannot deduce template type because nullptr can be any type
int main() {
f((Object ^) nullptr); // T = Object^, call f(Object ^)
// Delete the following line to resolve.
f(nullptr);
f(0); // T = int, call f(int)
}
Contoh: Meneruskan nullptr
sebagai parameter fungsi
Contoh kode berikut menunjukkan bahwa nullptr
dapat digunakan sebagai parameter fungsi.
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
test
Contoh: Inisialisasi default
Contoh kode berikut menunjukkan bahwa ketika handel dinyatakan dan tidak diinisialisasi secara eksplisit, mereka secara default diinisialisasi ke nullptr
.
// mcpp_nullptr_5.cpp
// compile with: /clr
using namespace System;
ref class MyClass {
public:
void Test() {
MyClass ^pMyClass; // gc type
if (pMyClass == nullptr)
Console::WriteLine("NULL");
}
};
int main() {
MyClass ^ x = gcnew MyClass();
x -> Test();
}
NULL
Contoh: Menetapkan nullptr
ke penunjuk asli
Contoh kode berikut menunjukkan bahwa nullptr
dapat ditetapkan ke penunjuk asli saat Anda mengkompilasi dengan /clr
.
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
Persyaratan
Opsi pengkompilasi: (Tidak diperlukan; didukung oleh semua opsi pembuatan kode, termasuk /ZW
dan /clr
)
Baca juga
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