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指针则仍然存在无法区分应实际调用哪个函数
- 必须显示的指明参数类型