栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11 NULL和nullptr 的区别

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11 NULL和nullptr 的区别

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
    inline operator T*() const
        { return 0; }
 
    template
    inline operator T C::*() const
        { return 0; }
 
private:
void operator&() const;
} nullptr = {};

来自:csu_zhengzy~的博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929034.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号