C++11 新特性之 nullptr

对于有一定编程基础的人对于NULL这个毫不陌生,但是NULL并不是一个关键字而是一个宏,他在C语言中这样定义:

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define NULL (void*)0   

被定义为了一个(void*)0的宏,所以NULL是一个不指向任何对象的指针,也可以用0表示。这样定义在C语言中使用是毫无问题的。但是,C++由于函数重载的问题,重新通过宏定义NULL,C++中的定义如下:

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef NULL    
  2. #ifdef __cplusplus    
  3. #define NULL    0    
  4. #else    
  5. #define NULL    ((void *)0)    
  6. #endif    
  7. #endif   

可以看出,C++把NULL定义为了0,而不是C语言中的(void *)0;但是这样做,还是会造成函数的二义性,因为C++有参数类型的隐式转化问题。下面我们通过一段代码来讲解一下问题所在,代码如下:

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void func(int a){  
  2.     printf("this is int a = %d",a);  
  3. }  
  4. void func(char* a){  
  5.     printf("this is char* a = %s",a);  
  6. }  
  7. int main(int argc, const char * argv[])  
  8. {  
  9.       
  10.     func(0);  
  11.       
  12.     return 0;  
  13. }  

当我们在main函数中调用 func函数时,会报错,因为编译器不知道你要用的是那个func,为什么会造成这样的问题,是因为0 既可以是0(整数)又可以是void *(空指针),所以让造成编译器不知道到底要去连接那个函数。

C++的开发人员也意识到了这种蛋疼的问题,所以他们就重新开发出了今天课程的主角nullptr。

好了,下面热烈欢迎我们的主角nullptr闪亮登场。

nullptr:前面的朋友,左边的朋友,右边的朋友,跟一起嗨起来,“哎未巴蒂,黑喂狗,苍茫的天涯是我的爱。。。。。”。

下面我们来通过nullptr修改一下上面的实例代码,看看效果如何:

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void func(int a){  
  2.     printf("this is int a = %d",a);  
  3. }  
  4. void func(char* a){  
  5.     printf("this is char* a = %s",a);  
  6. }  
  7. int main(int argc, const char * argv[])  
  8. {  
  9.       
  10.     func(nullptr);  
  11.     return 0;  
  12. }  

输出结果为:


可以看出在main中成功调用了char* 为参数的func函数。可能有同学会问:为毛不是调用int参赛的func。因为nullptr是一个指针,并不是宏定义的0。

下面来解决一下nullptr的应用场景:

1,如果编译器支持nullptr,那么大多数情况下nullptr和NULL是可以互换的:

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int *p1 = 0;  
  2.     int *p2 = nullptr;  
  3.     if(p1 == 0);  
  4.     if(p2 == 0);  
  5.     if(p1 == nullptr);  
  6.     if(p2 == nullptr);  
  7.     if(p1 == p2);  

以上情况都是允许的。

2,可以用nullptr来初始化函数指针

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void(*func) f = nullptr;  

上面讲了nullptr的使用,老规矩,这节课还是不能结束,这是为毛呢,因为C++新东西到来总会伴有副作用的,C++一直都是这个尿性,不然linus也会说C++是拆了东墙补西墙了。

那大家猜猜我们要注意那几条呢,4条,5条,还是10条呢(哈哈,吓尿了没?)表害怕嘛,其实就一条啦,嘎嘎。

下面是使用nullptr所需要注意的:

1,nullptr不能赋值为整数,也不能和整数进行比较

[cpp]   view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int a = 0;  
  2. int b = nullptr;//错误  
  3. if (a == nullptr);//错误  
  4. nullptr = 0;//错误  

OK,nullptr就讲到这儿,最后总结一下,nullptr的出现就是位了解决NULL的歧义问题的。还有就是记住nullptr是ptr(指针)不能和0互换的。总结完了,大家是不是忽然感觉nullptr很简单。哈哈
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值