• wordpress CMS主题:ssmay主题wordpress CMS主题:ssmay主题
  • 首页 > C++开发 > C++语言的nullptr 与 C语言NULL的使用

    C++语言的nullptr 与 C语言NULL的使用

    作者: 分类:C++开发 点击: 355 次
    wordpress CMS主题:ssmay主题

      在 C 语言中,我们使用NULL表示空指针,它实际上是一个宏,具体被定义为,

      /* C 语言程序 */
      #define NULL ((void*)0)
      #define NULL 0 /* 两者皆可 */

      注:因为在 C 语言中,是允许void指针隐式转换为其它类型指针的,所以#define NULL ((void*)0)这样的定义不会有问题。

      C++ 语言出现后,为了保持对 C 语言的兼容,保留了NULL,但对NULL的定义变得更为严格,

      /* C++ 语言程序 */
      #ifdef __cplusplus
          #define NULL 0
      #else
          #define NULL ((void*)0)
      #endif

      NULL被定义为 0,而不是((void*)0),因为在 C++ 语言中,void指针是不可以隐式转换为其它类型指针的,必须显示转换,

      /* C++ 语言程序 */
      #define NULL ((void*)0) /* 如果在 C++ 语言中这么定义的话 */
      
      int* a = NULL; /* 隐式转换,错误 */
      int* a = (int*)NULL; /* 显示转换,正确,但很麻烦,所以 NULL 都会被定义为 0 */

      在 C++ 98 之前(包括 C++ 98),在对NULL的使用上,都一直存在一个问题,假设有下面的代码,

      /* C++ 语言程序 */
      void func(int i);
      void func(char* p);
      
      func(NULL); /* 该调用哪个?*/

      NULL其实就是等于 0,对于上面的两个函数,它都是符合的,如此,就会出现语义二义性的错误。

      为了解决上述重载函数所带来的问题,C++ 11 的nullptr应运而生。nullptr实质上是一个常量,实现代码大致如下,

      /* C++ 语言程序 */
      const /* 常量 */
      class
      {
      public:
          template<class T>
          operator T*() const /* 向任意类型的非成员指针转换 */
          {
              return 0;
          }
      
          template<class C, class T>
          operator T C::*() const /* 向任意类型的成员指针转换 */
          {
              return 0;
          }
      
      private:
          void operator&() const /* 不可取地址 */
          {
          }
      } nullptr = {};

      nullptr只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为nullptr在实际编程中的应用实在太广泛,因此 C++ 编译器一般都会把nullptr定为关键字,避免程序员的滥用。

      当然,C++ 11 发布后,并没有因为nullptr的出现,而摒弃NULL,主要是为了兼容旧版程序。

      最后,总结一下,

      1. 在 C 语言编程中,请使用NULL此时的NULL,要么是((void*)0),要么是 0,对于 C 语言而言,都无所谓。
      2. 在 C++ 语言编程中,请使用nullptr既为了避免以后出现 bug,也为了养成一个良好的编程习惯。


      QQ二维码

    文章作者:高时银博客
    本文地址:http://wanlimm.com/77201809156904.html
    版权所有 © 转载时必须以链接形式注明作者和原始出处!

    上一篇:
    下一篇:
    wordpress CMS主题:ssmay主题

    或许你会感兴趣的文章:

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    This site uses Akismet to reduce spam. Learn how your comment data is processed.