nullptr的出现是为了解决C++中重载特性混乱的问题.
1、重载特性混乱的原因
- 不同的c++compiler 会将
NULL
定义为((void*)0
或0
从而导致调用函数foo(NULL)void foo(char *); void foo(int);
会得到不同的结果
(但实际上foo(NULL)的调用方式在编译时是无法通过的)
- c++不用许
void*
隐式转换为其他类型2、解决方案
- 创造了
nullptr_t
类型的nullptr
,它可以隐式转换为任意指针类型,也可以进行等不等比较.3、实验
#include <iostream> void foo(char *); void foo(int); int main() { if(NULL == (void *)0) std::cout << "NULL == 0" << std::endl; else std::cout << "NULL != 0" << std::endl; foo(0); // foo(NULL); // 编译无法通过 foo(nullptr); return 0; } void foo(char *ch) { std::cout << "call foo(char*)" << std::endl; } void foo(int i) { std::cout << "call foo(int)" << std::endl; }
在
g++ main.cpp -g -std=c++14 -o a.out
命令编译compile,./a.out
运行后得到NULL == 0 call foo(int) call foo(char*)
所以为了更好的使用
c++函数重载特性
要养成使用nullprt
的习惯