nullptr提供类型安全的空指针表示,解决了NULL因定义为0或void*导致的重载歧义和类型不安全问题。它具有独立类型std::nullptr_t,可隐式转换为任意指针类型但不可转为整型,从而消除调用歧义、提升代码清晰度与健壮性,是C++11起初始化、传参、返回空指针及泛型编程中的首选方案。

nullptr
NULL
NULL
void*
从我个人的编程经历来看,
NULL
0
((void*)0)
NULL
0
int
void func(int)
void func(char*)
func(NULL)
即便
NULL
((void*)0)
void*
nullptr
std::nullptr_t
std::nullptr_t
bool
false
NULL
NULL
0
我经常觉得,
NULL
0
0
一个典型的场景就是函数重载。假设你有一个函数,它有两个版本:一个处理整数,另一个处理指针。比如:
void process(int value) { /* ... */ }
void process(char* ptr) { /* ... */ }如果你尝试调用
process(0)
process(int)
process(NULL)
NULL
0
0
再者,即便
NULL
((void*)0)
void*
nullptr
nullptr
std::nullptr_t
bool
我们可以用一个例子来直观感受这种差异:
#include <iostream>
void do_something(int i) {
std::cout << "Called with integer: " << i << std::endl;
}
void do_something(char* p) {
std::cout << "Called with char* pointer: " << static_cast<void*>(p) << std::endl;
}
int main() {
// do_something(NULL); // 编译错误:调用歧义,因为NULL可能是0
do_something(0); // 明确调用 do_something(int)
do_something(nullptr); // 明确调用 do_something(char*)
char* my_ptr = nullptr; // 正确且类型安全地初始化空指针
do_something(my_ptr); // 明确调用 do_something(char*)
// int val = nullptr; // 编译错误:nullptr不能隐式转换为int
if (nullptr) { // nullptr在布尔上下文中为false
std::cout << "This will not be printed." << std::endl;
}
return 0;
}从上面的代码片段可以看出,当
do_something(nullptr)
do_something(char*)
nullptr
NULL
nullptr
在我看来,在任何需要表示空指针的场合,从C++11及更高版本开始,都应该无条件地优先使用
nullptr
具体来说,使用
nullptr
当你初始化一个指针时,无论是指向动态分配内存的指针,还是一个成员指针,都应该用
nullptr
MyObject* obj_ptr = nullptr; std::unique_ptr<AnotherObject> smart_ptr = nullptr;
这比
MyObject* obj_ptr = NULL;
MyObject* obj_ptr = 0;
在函数参数中传递空指针时,
nullptr
nullptr
0
从函数返回空指针时,使用
nullptr
char* find_char(const std::string& s, char c) {
// ...
return nullptr; // 如果没找到,返回nullptr
}在模板元编程或泛型代码中,
nullptr
0
NULL
nullptr
总而言之,
nullptr
以上就是nullptr为什么替代NULL 类型安全指针空值方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号