再谈NULL和nullptr(C++11)区别

简介: 在谈NULL和nullptr区别之前,我们先看段代码:

在谈NULL和nullptr区别之前,我们先看段代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
void func(void *p)
{
  cout << "p is pointer " << p << endl;
}
void func(int num)
{
  cout << "num is int " << num << endl;
}
int main(void)
{
  void *p = NULL;
  func(p);
  func(NULL);
  func(nullptr);
  return 0;
}

大家猜猜执行结果是怎样的?

5188b008cd6d64771d10e3cf731d956c.pngfunc(NULL)执行结果是 num is  int 0,


翻开NULL的定义,可以看到


C语言里面:

#define NULL ((void*)0)

C++里面,它是这样定义的:

#define NULL    0

查看完整的定义:

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

C语言我们用NULL作为指针变量的初始值,而在C++一般不建议这么做,C++中,如果想表示空指针,建议使用nullptr,而不是NULL。


NULL具有二义性,为了解决这种二义性,C++11标准引入了关键字nullptr作为空指针常量。


我们开头的代码function(nullptr)会调用func(void*),因为nullptr隐式转换为指针类型,而无法隐式转换为整形,编译器会找到形参为指针的函数版本。nullptr的出现消除了0带来的二义性,类型和含义更加明确。实际使用过程中,建议在编译器支持的前提下优先使用nullptr。

相关文章
|
1月前
|
存储 算法 C++
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
54 1
|
1月前
|
C++ 容器
c++ STL 之 vector 的 capacity 和 size 属性区别
c++ STL 之 vector 的 capacity 和 size 属性区别
33 0
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
111 0
|
1月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
33 1
|
3月前
|
Java 编译器 C++
Java开发和C++开发有什么区别
Java开发和C++开发有什么区别
|
1月前
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
64 2
|
1月前
|
安全 算法 程序员
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
50 0
|
1月前
|
安全 算法 程序员
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
31 1
|
1月前
|
算法 编译器 C++
【C++ 概念区分】C++ 中覆盖,重写,隐藏 三者的区别
【C++ 概念区分】C++ 中覆盖,重写,隐藏 三者的区别
19 0
|
1月前
|
编译器 测试技术 调度
C++ 中 template<class T>和template<typename T>的区别
C++ 中 template<class T>和template<typename T>的区别
13 0