nullptr(C++ 组件扩展)
nullptr 关键字表示一个 null 指针值。使用空指针值指示对象句柄、内部指针或本机指针类型不指向对象。
使用托管代码或本机代码的 nullptr。编译器发出托管代码和本机 null 指针值的适当,但不同的命令。有关使用此关键字的 ISO C++ 标准版本的信息,请参见 nullptr。
__nullptr 关键字是具有含义和 nullptr相同的一个特定于 Microsoft 的关键字,但是,仅适用于本机代码。如果使用与本机 C/C++ 代码的 nullptr 然后编译 /clr 编译器选项,编译器无法确定 nullptr 是否指示一个本机或托管 null 指针值。若要指示您的意图对编译器,请使用 nullptr 指定托管值或 __nullptr 指定本机值。
nullptr 关键字与在 Visual Basic 中 Nothing 和 null 等效在 C#。
用法
可以使用 nullptr 关键字的任意位置处理,本机指针,也可以使用函数参数。
nullptr 关键字不是类型和不支持用于:
nullptr 关键字可在下面的指针类型的初始化:
本机指针
Windows 运行时句柄
托管处理
托管内部指针
nullptr 关键字可用于测试,如果指针或句柄引用为空,则使用之前引用。
在使用 null 指针应正确解释错误检查的值的语言中函数调用。
无法初始化处理为零;可以只使用 nullptr。常数 0 的分配若要处理对象的生产装箱的 Int32 和一个转换为 Object^。
示例
下面的代码示例显示了,可以使用 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 和零在本机指针可互换使用。
// 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");
}
Output
示例
下面的代码示例演示,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 值的转换类型。
// 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 可用作函数参数。
// mcpp_nullptr_4.cpp
// compile with: /clr
using namespace System;
void f(Object ^ x) {
Console::WriteLine("test");
}
int main() {
f(nullptr);
}
Output
示例
下面的代码示例演示了,那么,当处理声明和不显式初始化时,它们是默认初始化为 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();
}
Output
示例
下面的代码示例演示,nullptr 可分配到本机指针,在使用编译 /clr时。
// mcpp_nullptr_6.cpp
// compile with: /clr
int main() {
int * i = 0;
int * j = nullptr;
}
要求
编译器选项:(不要求;支持所有代码生成选项,包括 /ZW 和 /clr)