天天看点

C++98中的空值nullptr

平时我们所用的空值是:NULL;在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL 
#ifdef __cplusplus 
#define NULL    0 
#else #define NULL    ((void *)0) 
#endif 
#endif 
           

NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。

下面就会引起一个问题:

void f(int) {  cout<<"f(int)"<<endl; } 
 
void f(int*) {  cout<<"f(int*)"<<endl; } 
 
int main() {  
    f(0);  
    f(NULL);  
    f((int*)NULL);  
    return 0; 
}
           

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0或者(void*)类型的函数,因此与程序的初衷相悖。

实际是按0编译的;编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

为了考虑兼容性,C++11给出了全新的nullptr表示空值指针。:为了避免混淆,C++11提供了nullptr, 即:nullptr代表一个指针空值常量。nullptr是有类型的,其类型为nullptr_t,仅仅可以被隐式转化为指针类型,nullptr_t被定义在头文件中:typedef decltype(nullptr) nullptr_t; 

注意:

  • 1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  • 2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

继续阅读