nullptr(C++/CLI 和 C++/CX)

nullptr 关键字表示空指针值。 空指针值可用于指明对象句柄、内部指针或本机指针类型不指向对象。

结合使用 nullptr 与托管代码或本机代码。 编译器为托管空指针值和本机空指针值发出相应但不同的指令。 若要了解如何使用此关键字的 ISO 标准 C++ 版本,请参阅 nullptr

__nullptr 是 Microsoft 专用关键字,虽然与 nullptr 的含义相同,但仅适用于本机代码。 如果你将 nullptr 与本机 C/C++ 代码结合使用,然后使用 /clr 编译器选项进行编译,那么编译器便无法确定 nullptr 指明的是本机空指针值,还是托管空指针值。 要向编译器明确表达你的意图,请使用 nullptr 来指定托管值,或使用 __nullptr 来指定本机值

nullptr 关键字相当于 Visual Basic 中的“无”和 C# 中的“null”

使用情况

nullptr 关键字可用于任何能使用句柄、本机指针或函数参数的位置。

nullptr 关键字不是一种类型,也不支持用于:

  • sizeof

  • typeid

  • throw nullptr(尽管 throw (Object^)nullptr; 可以正常发挥作用)

nullptr 关键字可用于初始化以下指针类型:

  • 本机指针

  • Windows 运行时句柄

  • 托管句柄

  • 托管内部指针

nullptr 关键字可用于在使用指针或句柄引用之前,先测试引用是否为空。

应正确解释使用空指针值进行错误检查的语言之间的函数调用。

无法将句柄初始化为 0;只能使用 nullptr。 将常数 0 赋给对象句柄会生成装箱的 Int32,并强制转换为 Object^

示例:nullptr 关键字

下面的代码示例展示了 nullptr 关键字可用于任何能使用句柄、本机指针或函数参数的位置。 此示例还展示了 nullptr 关键字可用于在使用引用之前先检查引用。

// 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 ^)
}

示例:nullptr 和零可互换使用

下面的代码示例展示了可以对本机指针交换使用 nullptr 和 0。

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

示例:将 nullptr 解释为句柄

下面的代码示例展示了 nullptr 被解释为指向任何类型的一个句柄,或指向任何类型的一个本机指针。 如果函数重载了多个指向不同类型的句柄,便会生成多义性错误。 必须将 nullptr 显式强制转换为一种类型。

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

示例:强制转换 nullptr

下面的代码示例展示了可以强制转换 nullptr,并返回指向强制转换类型的指针或句柄,其中包含 nullptr 值。

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

示例:将 nullptr 作为函数参数传递

下面的代码示例展示了 nullptr 可用作函数参数。

// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
   Console::WriteLine("test");
}

int main() {
   f(nullptr);
}
test

示例:默认初始化

下面的代码示例展示了已声明但未显式初始化的句柄默认初始化为 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

示例:将 nullptr 赋给本机指针

下面的代码示例展示了在使用 /clr 编译时,可以将 nullptr 赋给本机指针。

// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
   int * i = 0;
   int * j = nullptr;
}

要求

编译器选项:(非必需;受所有代码生成选项支持,包括 /ZW/clr

另请参阅

.NET 和 UWP 的组件扩展
nullptr