C++11 新特性之 nullptr

本文介绍了C++11引入的关键字nullptr,作为NULL的替代品,避免了类型转换的潜在问题。通过示例展示nullptr在函数调用中的作用,并探讨了其应用场景,包括与NULL的互换使用及初始化函数指针。同时强调了使用nullptr时应注意的唯一规则:nullptr不能赋值为整数或与整数比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于有一定编程基础的人对于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;
}

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

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

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

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

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

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(nullptr);
    return 0;
}

输出结果为:


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

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

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

int *p1 = 0;
    int *p2 = nullptr;
    if(p1 == 0);
    if(p2 == 0);
    if(p1 == nullptr);
    if(p2 == nullptr);
    if(p1 == p2);

以上情况都是允许的。

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

void(*func) f = nullptr;

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

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

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

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

    int a = 0;
    int b = nullptr;//错误
    if (a == nullptr);//错误
    nullptr = 0;//错误

OK,nullptr就讲到这儿,最后总结一下,nullptr的出现就是位了解决NULL的歧义问题的。还有就是记住nullptr是ptr(指针)不能和0互换的。总结完了,大家是不是忽然感觉nullptr很简单。哈哈


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值