【C++】nullptr与NULL区别

1. nullptr和NULL类型区别

  • NULL是一个无类型的东西,而且是一个宏。0为null pointer constant的。赋予null pointer,应该是使用0,而非NULL。
  • nullptr是有类型的(放了在stddef头文件中),类型是 typdef decltype(nullptr) nullptr_t;

2. C++中NULL使用存在的问题

  • 在c语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。
  • 在c++环境下情况就复杂起来, 首先我们将void*直接赋值给一个指针是不合法的,编译器会报错。有重载或者模板推导的时候,编译器就无法给出正确结果。

3. nullptr的应用:

直接使用nullptr来替代NULL的宏定义,正常使用中它们完全等价。

4. 模拟nullptr的实现:

//[cpp]  www.2cto.com
const class nullptr_t_t  
{  
public:  
    template<class T>           operator T*() const {return 0;}  
    template<class C, class T>  operator T C::*() const { return 0; }  
private:  
    void operator& () const;  
} nullptr_t = {};  
#undef NULL  
#define NULL nullptr_t   

### C++ 链表中 `nullptr` `NULL` 的区别C++编程语言里,特别是在处理链表这样的数据结构时,`nullptr``NULL`都可以用来表示空指针的状态。然而,在现代C++实践中推荐使用`nullptr`而不是`NULL`。 #### 类型安全性差异 `NULL`本质上是一个宏定义,通常被设置为整数值0或者是`(void*)0`[^2]。这意味着它可以隐式地转换成几乎任何类型的值,这可能会引发意外的行为尤其是在模板代码或是重载函数调用的情况下。相反,`nullptr`是专门设计作为指向对象或函数的右值表达式的特殊关键字,仅能赋给指针变量,并且不会自动转为其他非指针类型的数据[^3]。 #### 可读性维护便利性的考量 采用`nullptr`有助于提高程序的可读性清晰度。由于其明确代表了一个“无”的概念——即不存在有效的地址引用,因此对于阅读代码的人来说更加直观易懂。此外,当项目从较旧版本迁移到支持C++11特性的编译器环境时,统一替换所有的`NULL`为`nullptr`能够减少潜在错误并简化调试过程[^1]。 #### 实际应用中的表现 考虑如下简单的单向链表节点定义以及遍历逻辑: ```cpp struct ListNode { int val; ListNode* next; explicit ListNode(int x) : val(x), next(nullptr) {} // 使用 nullptr 初始化成员变量 }; // 假设 head 是某个已知的有效列表头部指针... for (ListNode *current = head; current != nullptr /* 或者 !current */ ; current = current->next){ std::cout << "Node value:" << current->val << '\n'; } ``` 在这个例子中,通过将新创建的对象的`next`字段显式初始化为`nullptr`,可以清楚表明该位置目前没有任何链接到下一个元素的信息;而在循环条件判断处也采用了同样的做法来终止迭代流程。如果这里改用`NULL`虽然也能工作,但在语义上不如前者那么精确[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值