NULL、nullptr

C++中NULL和nullptr区别?

  • NULL来自C语言,一般由宏定义实现,而 nullptr 则是C++11的新增关键字。
  • 在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0,如下定义:
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
  • 在C++中指针必须有明确的类型定义。但是将NULL定义为0带来的另一个问题是无法与整数的0区分。

问题描述:
C++中允许有函数重载,所以可以试想如下函数定义情况:

#include <iostream>
using namespace std;

void fun(char* p) {
	cout << "char*" << endl;
}

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

int main()
{
	fun(NULL);
	return 0;
}
//输出结果:int
  • 在传入NULL参数时,会把NULL当做整数0来看,如果我们想调用参数是指针的函数,该怎么办呢?
  • 解决办法:nullptr在C++11被引入用于解决这一问题
    • nullptr可以明确区分整型和指针类型
    • 能够根据环境自动转换成相应的指针类型,但不会被转换为任何整型
    • 另外由于nullptr是明确的指针类型,所以不会与整形变量相混淆

nullptr的问题:

#include <iostream>
using namespace std;

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

void fun(int p)
{
	cout<< "int p" <<endl;
}
int main()
{
    fun((char*)nullptr);//语句1
	fun(nullptr);//语句2
    fun(NULL);//语句3
    return 0;
}
//运行结果:
//语句1:char* p
//语句2:报错,有多个匹配
//3:int p
  • 在存在对不同指针类型的函数重载,此时如果传入nullptr指针则仍然存在无法区分应实际调用哪个函数
  • 必须显示的指明参数类型

原文链接: https://www.cnblogs.com/xiaoqing-ing/p/17146957.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    NULL、nullptr

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/319854

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月24日 下午3:29
下一篇 2023年2月24日 下午3:29

相关推荐