C++11 NULL和nullptr 的区别
1. 解决的问题
在C语言中, NULL被定义为(void*) 0,也就是将常数0转换为void* 类型的指针。由于在C语言中,支撑void* 类型的指针的隐式转换,因此这种做法是行得通的。然而,在C++中却不支持这种隐式转换了,也就是:
int* a = (void*)0; //将void*类型转换成int* 在C++中已经行不通了
那怎么办呢?所以在c++中,NULL的定义其实是:
# define NULL 0
也就是NULL的定义其实是0了,所以在C++中又可以欢快的把NULL转换成任意类型的指针。但是这样做问题又来了:0其实是一个int类型的,在函数调用的时候,会出现二义性的问题:你这个NULL究竟是个NULL还是个空指针?比如:
void fun(void* para) {
cout << "我是指针"<< endl;
}
void fun(int para) {
cout << "我是int"<< endl;
}
fun(NULL);
在这种情况下,其实fun函数调用的是形参为0的那个函数(或者有些编译器报错),与我们的直觉是相违背的。(本意是想着NULL是个指针,所以调用第一个fun)。因此,nullptr 应运而生啦。使用nullptr来调用就不会有上面的问题:
void fun(void* para) {
cout << "我是指针"<< endl;
}
void fun(int para) {
cout << "我是int"<< endl;
}
fun(nullptr);
这时候就是调用指针版本的fun函数了。
其他
关于nullptr的实现,其实是个类模板,根据指向的类来强制把0转换成指向的类型的指针。贴一个实现:
const class nullptr_t
{
public:
template<class T>
inline operator T*() const
{ return 0; }
template<class C, class T>
inline operator T C::*() const
{ return 0; }
private:
void operator&() const;
} nullptr = {};
C++11引入了nullptr来解决C++中NULL作为指针和整型值二义性的问题。NULL在C++11中实际上是0,可能导致类型转换和函数调用的混淆。nullptr是一个 nullptr_t 类型的常量,专门用于表示空指针,避免了类型转换和二义性,确保在函数调用时明确为指针类型。
2953

被折叠的 条评论
为什么被折叠?



