C++11 新特性之 nullptr

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

#define NULL (void*)0 

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

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

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

void func(int a){
    printf("this is int a = %d",a);
}
void func(char* a){
    printf("this is char* a = %s",a);
}
int main(int argc, const char * argv[])
{
    
    func(0);
    
    return 0;
}

当我们在mai
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值