首页 > 其他分享 >106.nullptr和NULL

106.nullptr和NULL

时间:2023-07-15 12:45:45浏览次数:42  
标签:int void nullptr test cpp NULL 106

106.nullptr和NULL

1.NULL是什么

《NULL,0,'\0',"0","\0"的区别》一文中,我们已经知道了在C中NULL是什么,在C的头文件中,通常定义如下:

#define NULL ((void*)0)

但是在C++中,它是这样定义的:

#define NULL 0

可以在stddef.h看到完整的这段:

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

也就是说,在C++中,NULL不过也是0罢了,把它当成空指针只是一个无可奈何的选择罢了。

那么为什么在C++和C中不一样呢?因为C++中不能将void *类型的指针隐式转换成其他指针类型,从下面的例子可以看出来:

//null.cpp
#include<iostream>
int main(void)
{
    char p[] = "12345";
    int *a = (void*)p;
    return 0;
}

编译:

$ g+ -o null null.cpp
null.cpp: In function 'int main()':
null.cpp:5:17: error: invalid conversion from 'void*' to 'int*' [-fpermissive]
int *a =(void*)p;

所以不能将NULL定义为(void*)0。

2.nullptr

nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。

2.1为什么该使用nullptr

回到最开始的问题,为什么作为指针的语义,我们应该使用nullptr,而不是NULL。 请看下面的代码:

#include<iostream>
using namespace std;

void test(void *p)
{
    cout<<"p is pointer "<<p<<endl;
}

void test(int num)
{
    cout<<"num is int "<<num<<endl;
}

int main(void)
{
    test(NULL);
    return 0;
}

编译:

$ g++ -o test test.cpp
main.cpp: In function ‘int main()’:
main.cpp:16:14: error: call of overloaded ‘test(NULL)’ is ambiguous
test(NULL);

很不幸,编译报错了,提示我们有二义性,两个都可以匹配,因此最终报错。

但是如果我们使用nullptr却不会:

test(nullptr);

除了这点之外,在C++模板中它还有更好的表现。 看下面的代码:

#include<iostream>
using namespace std;

template<typename Type1,typename ptrType>
void test(Type1 fun, ptrType ptr)
{
    /*do something*/
    fun(ptr);
    return;
}

void fun(int *val)
{
    cout<<"fun"<<endl;
}

int main(void)
{
    test(fun, NULL);
    return 0;
}

编译报错了:

main.cpp:8:8: error: invalid conversion from ‘long int’ to ‘int*’ [-fpermissive]
fun(ptr);

很显然NULL被推导为long int,而不是空指针,因而导致函数类型不匹配而报错。

但是如果我们用nullptr就不会有上面的问题。

注:nullptr在C++ 11中才出现。

参考:[(9条消息) nullptr与NULL的区别_nullptr和null区别_qq_37032670的博客-CSDN博客]

标签:int,void,nullptr,test,cpp,NULL,106
From: https://www.cnblogs.com/codemagiciant/p/17555962.html

相关文章

  • 7.null和undefined的区别
    7.null和undefined的区别?首先Undefined和Null都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null。undefined代表的含义是未定义,null代表的含义是空对象。一般变量声明了但还没有定义的时候会返回undefined,null主要用于赋值给一些可能会返......
  • 【AGC】删除控制台应用重建报错url is null问题
    ​【关键字】AGC、agconnect-services.json、InvalidParameterException 【问题描述】有开发者反馈在删除了AppGalleryConnect中某个应用及其对应的项目,再重新创建相同的应用(包名一致),并且重新下载agconnect-services.json到项目中,应用会因为com.huawei.agconnect闪退。报错......
  • python中None与Null的区别
    None是一个对象,而NULL是一个类型。Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、""(空字符串)、、()(空元组)、(空字典)都相当于False。  ......
  • Mybatis把0识别为null解决方法
    问题描述:以下方法写出来的id不能识别到0<iftest="id!=nullandid!=''">ANDid=#{id}</if>原因分析:Mybatis会自动将0识别为null,加上判断里面有空字符串的判断,导致了数据库无法存入0解决方案:加上一个0的判断条件即可<iftest="id!=nullandid!=''orid==0"......
  • 记一次CentOS7.7文件系统只读Read-only file system 并且/dev/只有一个设备文件 null
    环境VMwareWorkstationPro15.5操作系统CentOS7.7现象:处理方法1.单用户修复文件系统失败2.救援模式备份数据失败3.把不能正常启动的磁盘,挂载到正常启动虚拟机,扫描逻辑卷,激活,挂载(1)把有问题的磁盘挂载到正常启动的机器上选择需要修复的盘......
  • HJ106 字符逆序
    1.题目读题HJ106 字符逆序  考查点 2.解法思路 代码逻辑 具体实现publicclassHJ106{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(reverse(sc.nextLine()));}publicst......
  • Hystrix传播ThreadLocal对象,Feign调用返回null问题
    微服务与微服务之间相互调用,你是否有过使用Hystrix时,该传播ThreadLocal对象的困惑?  我们知道Hystrix有隔离策略:THREAD(线程池隔离):即:每个实例都增加个线程池进行隔离SEMAPHORE(信号量隔离):适应非网络请求,因为是同步的请求,无法支持超时,只能依靠协议本身   现在有如下两......
  • GetX 关于报错 Null check operator used on a null value的解决
    import'package:flutter/material.dart';import'package:get/get.dart';import'logic.dart';classGetIndexPageextendsStatefulWidget{intcount;GetIndexPage({requiredthis.count,Key?key}):super(key:key);@overr......
  • 不小心删除服务[null]后,git bash出现错误,如何解决?
    不小心删除服务[null]后,gitbash出现错误,如何解决?错误描述:打开gitbash、msys2都会出现错误「bash:/dev/null:Nosuchdeviceoraddress」问题定位:1.使用搜索引擎搜索「bash:/dev/null:Nosuchdeviceoraddress」,一般答案是[null]服务出现问题,可能是缺少对应的文件「C:......
  • SignalR 外部调用自定义Hub类的方法,Clients为null
    这是因为外部调用的类的对象和你连接的Hub类的对象,这两个对象不!一!样!解决方法在自定义的Hub类中,注入IHubContext对象,然后在方法中调用IHubContext对象来向前端推送数据publicclassDataHub:AbpCommonHub,ITransientDependency{publicIOnlineClientManag......