特性1:空指针nullptr

1、背景

在C语言中NULL其实是对(void*)0(也就是void*型强制0转换),在c++中为0。从cC++中对语言的类型要求更加严格,c++中==不允许void*类别的变量隐式转换为其他类型的指针==。

image-20220421100843881

1
2
void* ptr3=NULL;
char* ptr5=ptr3; // 这里不允许void*类型转换为char*

image-20220421100943658

2、存在问题

因此C++中为了兼容之前的C语法,将NULL定义为0,那么会存在如下==歧义问题==:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(int  n){
cout<< "f(int n)"<<endl;
}
void f(char * p){
cout<< "f(char * p)"<<endl;
}

int main()
{
f(10);
f(NULL); // 想调用void f(char * p),但是系统会自动调用void f(int n);
// 解决方案:将NULL进行显示强制类型转换
f((void*)NULL);
return 0;
}

3、解决方案

NULL改为nullptrnullptr并不是$0$,而是专门为指针类型定义的空指针类型,因此==可以自动进行类型转换==。

1
2
3
4
5
6
7
8
9
10
11
12
13
void f(int  n){
cout<< "f(int n)"<<endl;
}
void f(char * p){
cout<< "f(char * p)"<<endl;
}

int main()
{
f(10);
f(nullptr); //这里系统会自动将nullptr转为char*指针。
return 0;
}