Share via


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:

  • ukruandari

  • typeid

  • throw nullptr (meskipun throw (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

Ekstensi Komponen untuk .NET dan UWP
nullptr