本文主要是介绍C++中NULL与nullptr的区别小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与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*)的常量。不论采取何
种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
程序本意是想通过func(NULL)
调用指针版本的func(int*)
函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98android中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器
默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)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内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于C++中NULL与nullptr的区别小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!