今天讨论NULL和nullptr的区别
先来看一段代码:
#include <iostream>
#include <string>
class Example
{
public:
Example()
{
}
~Example()
{
}
print(int num)
{
std::cout << "int num is :" << num << std::endl;
}
print(std::string* ptr)
{
if(!ptr)
{
std::cout << "char* ptr is nullptr" << std::endl;
}else
{
std::cout << "char* ptr is :" << *ptr << std::endl;
}
}
};
int main()
{
Example examOne;
examOne.print(10);
examOne.print(NULL);
return 0;
}
你猜结果是啥:
is ambiguous:是二义的。非常好,出现了问题。
那我换种方式:
int main()
{
Example examOne;
examOne.print(10);
examOne.print(nullptr);
return 0;
}
这次结果正常,通过编译,运行结果如下:
good,good,good。结果符合预期,那他们之间有啥区别呢?
小乖编葵花课堂开课啦:
NULL:
NULL是一个预处理的宏定义,一般对标 0 或者 (void*)0 ,在编译阶段会进行宏替换,这就会导致一些模板推导时的混乱,也会导致函数重载时的二义性问题。
nullptr:
nullptr是一个std作用于下的专门表示空指针类型,我记得是:std::nullptr_t类型,是c++11引入的,可以转化为任意类型指针,在模板推导和函数重载时不会引起二义性问题。
区别:
所以在编译阶段,NULL会被编译器宏替换为0或者(void*)0,nullptr并不会。这就导致了,在模板推导或者函数重载调用时(运行时多态),导致的二义性问题。不同版本的编译器表现出来的现象不一样。
结语:
如果你不用模板多态和重载多态,这些有关c++多态的性质,在大多数情况下,使用NULL并没有什么问题。
但是使用nullptr表示空指针,一定比NULL优,有新的肯定用新的。再说,他也不是很新啦。
冲!用nullptr。