一、C++98 中 0 和 NULL 的使用
C++98 中的0即表示整数字面值0,又表示指针的0值
int x = 0; // 0 表示整数 0
int *p = 0; // 0 表示普通指针 0
C++98 规定 NULL
就是一个整型0值 #define NULL 0
,可以拿来当合法的整型使用(只是看起来比较尴尬)
int *q = NULL; // NULL表示指针 0,看起来没什么不合适
int y = NULL; // NULL表示整形 0,虽然合法但看起来很尴尬
C++98 不区分整数0和指针0,在重载整型和指针的场合就会遇到麻烦了:
void func(int) {}
void func(int*) {}
func(0); // 调用 func(int) 而不是 func(int*)
func(NULL); // 也是调用 func(int)
我们调用 func(NULL);
的意图是调用 func(int*);
,却无论如何也做不到,如果需要调用则必须将0显示转换成指针:func(static_cast<int*>(NULL));
二、C++11 中 nullptr 的使用
为了区分整数0和指针0,C++11引入了关键字 nullptr
,它能够转换成任何指针,表示指针的0值,但是它不能转换成整形:
int x = 0; // 表示整数 0
int *p = nullptr; // nullptr 表示指针 0
int y = nullptr; // 错误!不能将 nullptr 转换为整形
这样就将整数0和指针0区分开了,也可以解决整型和指针重载的问题
func(0); // 调用 func(int)
func(nullptr); // 调用 func(int*)
虽然 nullptr
的引入可以解决整型和指针重载函数的问题,但是C++11没有消除0可以表示空指针的性质,只是在 nullptr
的掩护下被隐藏了而已