nullptr与null

nullptr是有类型的(定义于cstddef文件),NULL只是一个宏定义而已。

typedef decltype(nullptr) nullptr_t;

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。
但是在c++环境下情况就变得复杂起来, 首先我们不能写这样的代码 FILE* fp = (void*)0; 将void*直接赋值给一个指针是不合法的,编译器会报错。 我们只能这样写代码:

FILE* fp = (FILE*)0;  
// or  
FILE* fp = 0;

所以在c++下面,NULL就被直接定义为一个整型 0。 在大多数情况下这并不会产生什么问题,但是万一有重载或者模板推导的时候,编译器就无法给出正确结果了。比如下面的情形:

template<class F, class A>
void test(F f, A a)
{
    f(a);
}
void f(void*)
{
    cout << 1;
}
test(f, NULL); //这里会报无匹配 

所以在C++中,强烈建议使用nullptr,摒弃NULL。

不能将nullptr赋值给整型:

if (nullptr == 0)  //rihgt, 两者等价
    cout << 1;

if (nullptr == NULL)  //rihgt, C++中NULL就是0,和上面的等价
    cout << 1;

int a = 0;
if (nullptr == a)  //error
    cout << 1;

const int b = 0;
if (nullptr == b)  //right, b 是一个立即数,所以正确
    cout << 1;

if (nullptr == (int)0)  //right
    cout << 1;
### C++ 中 `nullptr` `null` 的区别及使用场景 在 C++ 编程中,`nullptr` 是一种专门用来表示空指针的关键字,而 `null` 并不是标准的一部分,通常是指代常量 `0` 或宏定义的 `NULL`。以下是两者的具体差异及其适用场景: #### 1. 定义上的不同 `nullptr` 是 C++11 引入的一个关键字,它是一个独立的数据类型 `std::nullptr_t` 的唯一实例[^2]。相比之下,`null` 不是 C++ 标准库中的合法术语,而是可能被误解为整数值 `0` 或者通过宏定义为 `NULL`。 #### 2. 类型安全性的提升 当函数存在重载时,`nullptr` 提供了更高的类型安全性。如果一个函数既接受整数参数又接受指针参数,则传递 `0` 可能导致编译器无法判断应调用哪个版本。然而,使用 `nullptr` 则会明确指向指针上下文下的操作[^4]。 ```cpp void func(int); void func(char*); func(0); // 调用不明确,可能导致歧义 func(nullptr); // 明确调用了 char* 版本的函数 ``` #### 3. 更清晰的语义表达 尽管历史上程序员习惯于使用 `NULL` 来初始化或比较指针变量,但由于其本质只是整形值零(`#define NULL 0`),这容易引发混淆并降低代码可读性。引入 `nullptr` 后能够更直观地传达开发者意图——即该处涉及的是指针而非算术运算[^3]。 #### 4. 使用场景对比 - **推荐使用 `nullptr`:** - 初始化指针对象。 - 将指针设置为空状态以避免悬垂指针(dangling pointer)问题。 - **避免使用 `NULL` 或单纯依赖 `0`:** - 当前项目遵循现代 C++ 实践(C++11+)。 - 增强跨平台兼容性和未来维护便利度考虑下, 应弃用旧式做法转投新特性怀抱. 总结来说,在现代化 C++ 开发环境中应当优先选用 `nullptr`, 这不仅有助于提高程序健壮性同时也让源码更加易于理解和协作开发.[^1] ```cpp int* ptr = nullptr; // 正确且首选方式 if (ptr == nullptr) { } // 推荐作法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值