一 说明
NULL:C语言沿用过来的宏;
nullptr:C++11新增关键字,专门代表空指针。
// NULL本质,在C++里一般是这样定义 #define NULL 0 // 或者 #define NULL ((void*)0),但C++不允许直接把void*隐式转其他指针,所以大多直接定义成整数0核心问题:NULL是整数0,不是指针!!!
void func(int a) { cout << "调用int版本" << endl; } void func(char* p) { cout << "调用指针版本" << endl; } int main() { func(NULL); // NULL等价0,优先匹配func(int) func(nullptr);// nullptr是空指针常量,匹配func(char*) return 0; }func(NULL):传入整数 0,调用func(int),不符合预期,坑!
func(nullptr):传入空指针,调用指针重载版本,符合预期。
一 NULL
本质:宏,等价整数常量0
#define NULL 0特点:
1.是整数0,不是真正的指针类型;
2.存在重载函数歧义问题(上面的例子);
3.C++98就支持,继承C语言;
4.可以隐式转换成任意指针,但是它本身是数字;
二 nullptr
本质:C++11关键字,空指针常量,类型是std::nullptr_t
特点:
1.类型是专门的空指针类型,不是整数;
2.可以隐式转为任意类型空指针,但不能转换为整型;
3.函数重载时,会精准匹配指针版本,不会匹配int;
4.推荐C++代码全部使用nullptr代替NULL