c++中nullptr

c++中nullptrC 中为了避免 野指针 即指针在首次使用之前没有进行初始化 的出现 我们声明一个指针后最好马上对其进行初始化操作 如果暂时不明确该指针指向哪个变量 则需要赋予 NULL 值 除了 NULL 之外 C 11 新标准中又引入了 nullptr 来声明一个 空指针 这样 我们就有下面三种方法来获取一个 空指针 如下 int p1 NULL 需要引入 cstdlib 头文件 int p2

C++中为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:

如下:

int *p1 = NULL; // 需要引入cstdlib头文件 int *p2 = 0; int *p3 = nullptr; 

为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?

1.NULL在C++中的定义,NULL在C++中被明确定义为整数0:

/* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else /* __cplusplus */ #define NULL ((void *)0) #endif /* __cplusplus */ #endif /* NULL */ 

那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。

简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:

void Func(char *); void Func(int); int main() { Func(NULL); } 

如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数。

void Func(char *); void Func(int); int main() { Func(NULL); // 调用Func(int) } 

由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。

另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。

char *p1 = nullptr; // 正确 int *p2 = nullptr; // 正确 bool b = nullptr; // 正确. if(b)判断为false 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215189.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:29
下一篇 2026年3月18日 下午2:29


相关推荐

  • soft thresholding and hard thresholding

    soft thresholding and hard thresholding今天在看MichaelElad大牛的论文《OntheRoleofSparseandRedundantRepresentationsinImageProcessing》中,看到了softthresholding和hardthresholding这两个概念,很是不明白,所以上网查了一些资料,先把网上查的东西贴出来讨论下。网上资料大体是说这是指两类的函数,分别

    2022年6月8日
    65
  • linux复制/剪切文件到另一个文件夹「建议收藏」

    linux复制/剪切文件到另一个文件夹「建议收藏」复制/拷贝:cp文件名路径cphello.csv./python/ml:把当前目录的hello.csv拷贝到当前目的python文件夹里的ml文件夹里cp源文件名新文件名cphello.txtworld.txt:复制并改名,并存放在当前目录下cpfile1file2复制一个文件cpdir/*.复制一个目录下的所有文件…

    2022年8月23日
    21
  • 微信小程序 PHP后端form表单提交实例详解

    微信小程序 PHP后端form表单提交实例详解

    2021年10月15日
    40
  • initramfs 命令_linux initramfs

    initramfs 命令_linux initramfs原文地址:http://www.cnblogs.com/pied/archive/2013/01/29/2880718.html这个是翻译来的,原文地址:http://www.landley.net/writing/rootfs-howto.html怎样使用initramfs 工作过程简述在2.6kernel启动时,它把rootfs作为它的第一个文件系统挂载(注意:这里的rootfs是真名!!!不…

    2022年8月11日
    9
  • Linux中的程序和进程,PID和PPID

    Linux中的程序和进程,PID和PPID环境 VmwareWorkst CentOS 6 4 x86 64 程序和进程 1 程序 程序是静止的 程序就是磁盘上的一个文件 2 进程 进程是一个正在执行的程序的实例 3 进程是动态的 4 一旦程序被操作系统加载进内存了 那么这程序就成为了进程 PID 和 PPID 1 PID processID PID 是程序被操作系统加载到内存成为进

    2026年3月19日
    2
  • 使用JavaScript 实现 split方法

    使用JavaScript 实现 split方法/***将输入的字符串以逗号分割,忽略为空的情况只保留数组,返回一个数字组成的新数组*禁止使用String.split*提示:可以使用String.chatAt来取String的第n位字符,如’012′.charAt(1)===1*@param{string}str输入的字符串*@param{string}tag分割符*@return{string[]}*/conststr1=’,1,2,3,,44,555,6,78,.

    2025年7月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号