C++中的NULL和nullptr

c++中的NULL

C和C++里面的NULL是不一样的,C里面的NULL,它本质上是一个(void *)0,比如说你定义了一个

int *p = NULL;

那么他这个NULL,他用宏展开之后就变成了(void *) 0,它在C语言里面是可以的,这个(void *)0它会隐式转换成int,到时候它会转换成int *的,但是C++里面呢,它不行,为什么他无法这样子。把这个(void *)隐式转换成int *,因为C++它的类型的检验比C还要强,因为C++它的复杂程度比C高了一点,它就更容易触发一些稀奇古怪的错误,所以它在这里就更加要注意,它不允许你有这这样一个程度的自由度,所以它为了一个保证安全,就必须得要把这个禁掉,就不允许这样子用。

C++中的NULL直接就是0

C++里面他直接NULL就是个零了,所以int *p等于0,但是这也很奇怪,它也没有强制类型转换了,按理说你C++如果是一个强类型的话,你这不是也不行,但就是可以,他就是你把那定义成零了,那就是他可以,他这种情况下,它就可以把它这个零隐式转换成int*,就是这样子,你如果单纯把它定义成那等于零,它可以隐式转换。

函数重载时怎么解决

在C++里面,它是允许函数重载的,函数重载的意思就是说,他有可能有两个函数,它的函数名是一样的,但是它里面传的参数是不一样的。然后你在用的时候,它C++就会是,就是看你到时候用了这个函数名里面,你传的参是什么,然后去找它对应的函数。比如说一个传参是普通变量,另一个函数传的参数是指针变量,但他名字是相同的,那你在用的时候呢,你如果传的是一个指针,那么他就会找到那个传指针的那个函数名。如果你用的是一个传变量,那他就找到传变量那个东西,那个函数,函数名是一样的,这就叫做函数重载,它本质上还是刚刚还之前说了C跟C++混合,编程里面它有一个预处理,C++的预处理,它会把它的函数的那个传参,比如说它是int int,它就会变成ii,所以它两个函数,其实本质上在预处理里面已经变得不一样了。

所以说函数从在本质上还是预处理的时候,C++在预处理的时候,它把这函数名也变了。所以本质上讲,这函数你就算写的时候是一样的,但它在预处理的时候,它已经函数名是不一样的。

C++里面,他这个NULL这么定义,它有一个问题,就是在那个函数重载的时候,比如说你这函数重载,你的第一个是第一个传的参数是int类型,第二个传的参是那个int *类型,那你最后你再调用这个函数的时候,你给他传个NULL,那他到底是int类型还是int *类型呢,所以C++在这个时候呢,他为了避免引起歧意,他就在这里,就选择了报错,就不让你这么做。

C++中引入了nullptr

然后C加加为了避免这种歧义,他就发明了nullptr,你用这个的话他就不报错了,你用这个他就默认你这个用的是指针了,那你就是函数重载的时候呢,他就是用传的是指针的那一个函数。

NULL和nullptr的区别

这个nullptr的话,他跟NULL一个区别就是NULL,他是一个宏来的,但是nullptr是一个关键字来着,它就是发明了一个空指针给你用。

所以其实在C++里面的话,你定义一个指针,然后让它指向空的时候,那就不应该不应该是用NULL,而是用nullptr,比如说char *p等于nullptr,而不是做成NULL,因为他是在C++里面,NULL是一个宏,他直接就是个数字零,这是不对的,虽然他不报错,但是也是不太恰当了,因为他那是零,然后char *p的话,它是指针。虽然C++里面它是可以允许你这样编译通过的,但是其中严格上来说,你应该是用用C++里面它给你的关键字nullptr。nullptr就是C++里面为了解除歧义,然后专门发明了一个关键字。

nullptr的本质

这个nullptr的本质是一个类来的,就是你定义出来的一个类,它这个类里面呢,有一个在里面它会返回一个零,然后它重载呢,是把它变成了一个指针,所以说这个nullptr的本质就是你定义了一个类,然后这个类,它的类型是指针类型的。

const class nullptr_t
{
    public:
        template<class T> inline operator T*()const {return 0;}
        template<class C, class T> inline operator T C::*() const {return 0;}
    private:
        void operator&() const;
} nullptr={};

nullptr的缺点

其实这个nullptr它没有解决掉实质的问题,它说可以解决那个变量跟指针变量的一个重载的一个冲突问题,但是如果它的函数重载两个都是指针的,那这样的话,它nullptr也是无法解决的,就是说它两个指针nullptr也不知道你重载的是哪一个。

nullptr和void挺类似

其实这个nullptr他有点和void相似,因为他你看我们之前在C里面用的是void *,它可以是任意的一个数据类型,都可以,他到时候根据选择去做,然后这个nullptr的话,它其实也是跟void很相似,他都可以支持,就是你是哪一种类型都可以,到时候我都可以支持,你到时候是哪一个,nullptr就变成哪一个。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值