c++中的0、NULL、nullptr

c/c++中的NULL

  • 共同点:c/c++都有NULL,它是一个宏,值是一个空指针常量
  • 不同点:
    1. c将(void *)0作为空指针常量,因为c允许(void *)和其它指针类型相互隐式转换
    2. c++将0作为空指针常量,因为c++不允许(void *)和其它类型相互隐式转换
  • 总结:c++中0既是空指针常量,也是整形常量

nullptr的引入

  • c++中使用NULL可能会导致二义性

    #include<stddef.h>
    void foo(int){} //#1
    void foo(char*){} //#2
    int main(){
    	foo(NULL); //调用#1还是#2
    }
    

    此时,编译器将执行#1,与函数定义顺序无关

  • 引入nullptr

    1. nullptr能够根据环境自动转换成相应的指针类型,但是不会被转换成任何整形

    2. nullptr仍然存在一定问题

      void foo(char *ptr)
      void foo(int *ptr)
      

      此时无法区分实际调用哪个函数,必须显示指明类型,如:

      foo(static_cast<char*>(nullptr))