# nullptr 和 NULL的区别
面试高频指数:★★★★☆
在 C++11 之前,我们通常使用 NULL
来表示空指针。
然而,在 C++ 中,NULL
的定义实际上是一个整数值 0
,而不是一个真正的指针类型。
在函数重载和模板编程中这可能会导致一些问题和歧义。
为了解决这个问题,C++11 引入了一个新的关键字 nullptr
,用于表示空指针。
nullptr
是一种特殊类型的字面值,类型为 std::nullptr_t
,定义为: typedef decltype(nullptr) nullptr_t
,可以隐式转换为任何指针类型。
与 NULL
不同,nullptr
是一个真正的指针类型,因此可以避免一些由于 NULL
是整数类型而引起的问题。
以下是 nullptr
和 NULL
之间区别的一些例子:
# 函数重载
#include <iostream>
void foo(int x) {
std::cout << "foo() called with an int: " << x << std::endl;
}
void foo(char* x) {
std::cout << "foo() called with a char*: " << x << std::endl;
}
int main() {
// foo(NULL); // 编译错误:因为 NULL 会被解析为整数 0,导致二义性
foo(nullptr); // 无歧义:调用 void foo(char* x)
}
# 函数模板
#include <iostream>
#include <type_traits>
template <typename T>
void bar(T x) {
if (std::is_same<T, std::nullptr_t>::value) {
std::cout << "bar() called with nullptr" << std::endl;
} else {
std::cout << "bar() called with a non-nullptr value" << std::endl;
}
}
int main() {
bar(NULL); // 输出:bar() called with a non-nullptr value,因为 NULL 被解析为整数 0
bar(nullptr); // 输出:bar() called with nullptr
}
总之,C++11 引入了 nullptr
作为一个更安全、更明确的空指针表示,可以避免与整数 0
(即 NULL
)相关的一些问题。
在 C++11 及以后的代码中,建议使用 nullptr
代替 NULL
表示空指针。
最新原创的文章都先发布在公众号,欢迎关注哦~,
扫描下方二维码回复「CS」可以获得我汇总整理的计算机学习资料~
@2021-2024
编程指北 版权所有
粤ICP备2021169086号-2