一 说明NULLC语言沿用过来的宏nullptrC11新增关键字专门代表空指针。// 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.C98就支持继承C语言4.可以隐式转换成任意指针但是它本身是数字二 nullptr本质C11关键字空指针常量类型是std::nullptr_t特点1.类型是专门的空指针类型不是整数2.可以隐式转为任意类型空指针但不能转换为整型3.函数重载时会精准匹配指针版本不会匹配int4.推荐C代码全部使用nullptr代替NULL
阅读完成 · 觉得有帮助?