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指针则仍然存在无法区分应实际调用哪个函数
  • 必须显示的指明参数类型
posted @ 2023-02-23 10:10  小秦同学在上学  阅读(52)  评论(0编辑  收藏  举报