C++11 NULL和nullptr 的区别

C++11引入了nullptr来解决C++中NULL作为指针和整型值二义性的问题。NULL在C++11中实际上是0,可能导致类型转换和函数调用的混淆。nullptr是一个 nullptr_t 类型的常量,专门用于表示空指针,避免了类型转换和二义性,确保在函数调用时明确为指针类型。

C++11 NULL和nullptr 的区别

1. 解决的问题

在C语言中, NULL被定义为(void*) 0,也就是将常数0转换为void* 类型的指针。由于在C语言中,支撑void* 类型的指针的隐式转换,因此这种做法是行得通的。然而,在C++中却不支持这种隐式转换了,也就是:

	int* a = (void*)0//将void*类型转换成int* 在C++中已经行不通了

那怎么办呢?所以在c++中,NULL的定义其实是:

# define NULL 0

也就是NULL的定义其实是0了,所以在C++中又可以欢快的把NULL转换成任意类型的指针。但是这样做问题又来了:0其实是一个int类型的,在函数调用的时候,会出现二义性的问题:你这个NULL究竟是个NULL还是个空指针?比如:

void fun(void* para) {
	cout << "我是指针"<< endl;
}

void fun(int para) {
	cout << "我是int"<< endl;
}

fun(NULL);

在这种情况下,其实fun函数调用的是形参为0的那个函数(或者有些编译器报错),与我们的直觉是相违背的。(本意是想着NULL是个指针,所以调用第一个fun)。因此,nullptr 应运而生啦。使用nullptr来调用就不会有上面的问题:

void fun(void* para) {
	cout << "我是指针"<< endl;
}

void fun(int para) {
	cout << "我是int"<< endl;
}

fun(nullptr);

这时候就是调用指针版本的fun函数了。

其他

关于nullptr的实现,其实是个类模板,根据指向的类来强制把0转换成指向的类型的指针。贴一个实现:

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 = {};

来自:csu_zhengzy~的博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值