C++ NULL nullptr 0

众所知周,C++以及C语言最强的武器之一就是指针。但是为避免产生“野指针”。在必要的时候我们需要将我们的指针初始化,或者重置为空指针。

在C++11标准以前,我们可以借助于 0 和NULL;如下:

int *ptr = 0;
int *ptr = NULL; 

这样做有两个好处。避免野指针和禁止修改。
但我们知道NULL就是一个定义的宏。*#define NULL ((void )0)
当我们使用时,

int  *ptr =NULL;
double *Pdo= NULL;

void* 被转换为各自的类型。

C++11前C++关于NULL的定义。

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

在大多数情况下并不会出现问题。但是在函数进行指针的传参时,可能出现问题。

#include <iostream>
using namespace std;
 
void func(void* i)
{
	cout << "func1" << endl;
}
 
void func(int i)
{
	cout << "func2" << endl;
}
 
void main(int argc,char* argv[])
{
	func(NULL);
	func(0);
	getchar();
}

func2
func2

我们可以看到,出现了明显的二义性。执行不符合我们的预期。

标题C++11解决方案

C++11为维护稳定性,和NULL的现有使用,新定义了一种类型,nullptr_t,
而将此类型的右值常量作为nullptr供用户使用。nullptr是已经实例化号的对象。当然,如果必要的话我们可以定义出多个和nullptr一样的对象。

需要注意的是。nullptr也具有万能性

int * a1 = nullptr;
char * a2 = nullptr;
double * a3 = nullptr;

可以往不同类型转换。

同时,关于上面的二义性问题也可以得到解决:

#include <iostream>
using namespace std;
 
void func(void* i)
{
	cout << "func1" << endl;
}
 
void func(int i)
{
	cout << "func2" << endl;
}
 
void main(int argc,char* argv[])
{
	func(nullptr);
	func(NULL);
	getchar();
}

func1
func2

可以看到nullptr无法转换为整形,不会产生二义性。

总结:
在C++11标准下,相比于0和NULL,nullptr更加的鲁棒。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值