NULL与 nullptr的理解

本来我都不知道nullptr,学习的时候遇到了。这里查了一下,记录。

NULL

在C语言中,空指针可以使用(void *)0;NULL实际在c的头文件里面宏定义为空指针

#define NULL ((void *)0)

但在C++语言中,由于对语法的类型检查更为严格,因而空指针的值就不能表示为(void *)0;
例如,空指针的值

FILE *fp=(void *)0;//编译报错。即此时的 FILE *fp = NULL错误!
FILE *fp = 0;//正确

所以至少自C++98开始,修改了NULL的宏定义:

#define NULL 0

但是却带来了新的问题函数重载,调用不明
来看一个例子

#include<iostream>
using namespace std;
void f(int *p){
	cout<<"p is a pointer,its value is "<<*p<<endl;
}
void f(int n){
cout<<"n is a number"<<n<<endl;
}
int main(){
	f(NULL);//重载函数调用是不明确的。NULL = 0;
	return 0;
	}

在这里插入图片描述

C++11开始,定义了空指针的常值为nullptr,解决了上述函数重载问题。

nullptr

nullptr是C++11语言标准用来表示空指针的常量值,可以指派给任意类型的指针变量。部分编译器将之视为一个关键字,例如Visual Studio,部分使用旧标准的C++编译器则未实现,使用会报错!需要自行定义或引入额外的头文件
nullptr的实现

const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }

    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
    void operator&() const;
} nullptr = {};

修改上面示例,我们就能编译通过了。
在这里插入图片描述

C++语言标准规定:值0或std::nullptr_t类型的纯右值是空指针常量(null pointer constant)。可以通过空指针转换(null pointer conversion)成为某个类型的空指针值(null pointer value)。

C++语言标准还规定,在实参个数多于形参个数时(即可变参数个数的函数调用,可用va_arg来访问),多出来的实参如果是std::nullptr_t类型,则转化为(void *)0供函数访问

std::nullptr_t定义在标准头文件中。但实际上在源程序中不包含该头文件仍可以正常使用nullptr_t类型与nullptr对象。
nullptr_t
nullptr_t是字面常量nullptr的数据类型。它是一种特殊的类型,并不是一种指针类型也不是指向任何种变量类型的指针类型。nullptr_t位于std名字空间中,且定义于头文件中。可透过is_null_pointer来检查对象是否为这种类型。

nullptr除了解决函数重载问题,在C++模板中它还有更好的表现

//来源:公众号【编程珠玑】,https://www.yanbinghu.com
#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

参考文章1
参考文章2

发布了94 篇原创文章 · 获赞 66 · 访问量 5480

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/105106008