张斯禹的技术专栏 C++ and Python Coder

c++14中nullptr的作用

2019-01-25


nullptr的出现是为了解决C++中重载特性混乱的问题.



 1、重载特性混乱的原因

  • 不同的c++compiler 会将NULL定义为((void*)00从而导致调用函数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的习惯


Comments

Content