首页 > 编程语言 >【C++新特性】nullptr关键字

【C++新特性】nullptr关键字

时间:2023-05-14 11:11:39浏览次数:42  
标签:int nullptr C++ 关键字 Func NULL 指针

原文链接:http://blog.csdn.net/xiejingfa/article/details/50478512

 

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

如下:

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

新标准中建议使用nullptr代替NULL来声明空指针。到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。


C/C++中的NULL到底是什么

我们查看一下C和C++的源码,不难发现:

  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 */
  1. NULL在C中的定义 
    在C中,NULL通常被定义为如下:
#define NULL    ((void *)0)

也就是说NULL实质上是一个void *指针。

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

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

void Func(char *);
void Func(int);

int main()
{
    Func(NULL);
}

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

为什么要引入nullptr

C++把NULL定义为0,解决了函数重载后的函数匹配问题,但是又引入了另一个“问题”,同样是上面这段代码:

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++关键字。

nullptr如何使用

nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。

char *p1 = nullptr;     // 正确
int  *p2 = nullptr;     // 正确
bool b = nullptr;       // 正确. if(b)判断为false
int a = nullptr;        // error

标签:int,nullptr,C++,关键字,Func,NULL,指针
From: https://www.cnblogs.com/qianqiannian/p/17398922.html

相关文章

  • c++打卡第二十六天
    ①一、问题描述 二、设计思路①、我们可以定义long类型数,算出这个数的平方。②、我们可以判断这个数的位数,然后对平方数除余(数本身位数+1),得到一个余数,判断是否与自身数相等。③、如果相等就打印出来。三、流程图四、代码实现#include<iostream>#include<cmath>using......
  • C++11学习之auto
    原文链接: http://blog.csdn.net/xiejingfa/article/details/50469045 熟悉脚本语言的人都知道,很多脚本语言都引入了“类型自动推断”技术:比如python,可以直接声明变量,在运行时进行类型检查。随着C++11标准的发布,C++语言也引入了类型自动推断的功能,这就是我们今天要介绍的auto关......
  • c++ class类bfs模板题目
    题目网址:走迷宫-题目-Liuser'sOJ(cpolar.cn)原本代码(bfs广度优先搜索):#include<bits/stdc++.h>usingnamespacestd;constintN=50;intn,m;intsx,sy;chara[N][N];intb[N][N];boolvis[N][N];intdx[]={1,0,-1,0};intdy[]={0,-1,0,1};structnode{i......
  • 南桥杯C++AB组:递归
    目标:200到300道;目前:已学知识点:本文概述:cin|cout对比scanf|printf的区别使用前者,由于其有缓冲池,相对于后者,响应时间会长很多分析递归所有递归,都可以转化为一棵递归搜索树;......
  • C/C++中的强符号和弱符号
    C/C++中的强符号和弱符号先看如下场景//在1.c中定义了全局变量intg=1;intg2;同时//在2.c中也定义了全局变量intg=1;doubleg2;对上边C文件编译时会报符号重复定义(MultipleDefinition)的错误,这是因为在多个源文件中定义了同名的全局变量,且都已初始化。报错如下......
  • C++趣味编程
    折半查找。1#include<iostream>2usingnamespacestd;3#defineN104intmain()5{6inti,a[N]={-3,4,7,9,13,45,67,89,100,180},low=0,high=N-1,mid,k=-1,m;7cout<<"a数组中数据如下"<<endl;8for(inti=0;i<N;i++)......
  • wsl中c++环境配置
    sudoapt-getinstallnodejssudoapt-getinstallnpmsudoapt-getinstallclangd-12Gettingstarted(llvm.org) ......
  • c++练习
    #include<iostream>usingnamespacestd;classtime{public: inthour; intminute; intsec;};intmain(){ timet1; cin>>t1.hour; cin>>t1.minute; cin>>t1.sec; cout<<t1.hour<<":"; cout<<t1.minute<<":......
  • c/c++零基础坐牢第十一天
    c/c++从入门到入土(11)开始时间2023-05-13 12:24:38结束时间2023-05-13 16:21:58 前言:说到指针,我也显得像个初学者,《深入理解计算机系统》之3.10“综合:理解指针”这样说:“指针……以一种统一方式,对不同数据结构中的元素产生引用”。也有人这么说“当函数以数据的指针为参数时,......
  • C++ OpenCV安装教程
    C++OpenCV编译安装教程环境说明win10+MinGW64+Cmake下载mingw64(版本:12.1.0posix-seh)下载Cmake(版本3.17.5)注:mingw64和cmake下载安装完成后记得把bin目录添加到【环境变量】,如:下载opencv(版本4.6.0,下载后双击exe,选择目录进行解压即可)GitHub加速链接(复制下......