C++中NULL与nullptr的区别小结
目录
- C++98空值——NULL
- C++11空值——nullptr
- 区别对比
- 示例
C++98空值——NULL
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:int* p = NULL;
NULL实际上就是宏,在C头文件stddef.h
中可以看到关于NULL的定义
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
可以看到,NULL可能被定义为字面常量0,或者被定android义为无类型指针(void*)的常量。不论采取何
种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如: www.devze.com程序本意是想通过func(NULL)
调用指针版本的func(int*)
函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
C++11空值——nullptr
既然使用NULL
存在问题,那么就一定会有其他方式替换它。那就是nullptr
。底层原理上,nullptr
在编译时会被翻译为一个空指针常量的特殊值。这个特殊的值可以根据编译器的实现而有所不同,但它通常被定义为被解引用时不引发错误的值。
nullptr
更安全,不会出现引发不必要的错误。⭐nullptr注意事项:1.在使用nullptr
表示指针空值时,不需要包含头文件,因为nullptr
是C++11作为新关键字引入的。2. 在C++11中,sizeof(nullptr)
与 sizeof((void*)0)
所占的字节数相同。3.为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
区别对比
特性 | NULL | nullptr |
---|---|---|
引入版本 | C 和早期的 C++ | C++11 |
定义 | 宏,通常定义为 #define NULL 0 | 关键字,类型为 std::nullptr_t |
类型 | 整数常量,通常是 int | 专用类型 std::nullptr_t |
指针转换 | 可隐式转换为指针类型,但可能引起歧义 | 可隐式转换为任何指针类型,无歧义 |
整数转换 | 是一个整数,参与整数运算 | 不是整数,不能参与整数运算 |
安全性 | 易引起类型混淆,存在潜在的歧义问题 | 类型安全,避免了指针和整数混淆的问题 |
适用性 | 向后兼容的代码,旧式 C++ 项目 | 现代 C++ 编程,推荐使用 |
示例
展示了 nullptr
和 NULL
的不同效果:
#include <IOStream> using namespace std; void func(int) { cout << "func(in编程t) called" << endl; } void func(void*) { cout << "func(void*) called" << endl; } int main() { func(NULL); // 输出:func(int) called,因为 NULL 是整数类型 func(nullptr); // 输出:func(void*) called,因为 nullptr 是空指针类型 // 类型检查 int* p1 = NULL; // 合法,NULL 转换为 int* // int val = nullptr; // 错误,nullptr 不能隐式转换为 int int* p2 = nullptr; // 合法,nullptr 是类型php安全的空指针 return 0; }
到此这篇关于C++中NULL与nullptr的区别小结的文章就介绍到这了,更多相关C++ NULL与nullptr内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论