zoukankan      html  css  js  c++  java
  • C++11之nullptr

    C++11空指针

    1、NULL的问题

    class Test
    {
    public:
        void TestWork(int index)
        {
            std::cout << "TestWork 1" << std::endl;
        }
        void TestWork(int * index)
        {
            std::cout << "TestWork 2" << std::endl;
        }
    };
    
    int main()
    {
        Test test;
        test.TestWork(NULL);
        test.TestWork(nullptr);
    }

    运行结果:

      

    2、nullptr 解决问题

      早在 1972 年,C语言诞生的初期,常数 0 带有常数及空指针的双重身分。 C 使用 preprocessor macro NULL 表示空指针, 让 NULL 及 0 分别代表空指针及常数 0。 NULL 可被定义为 ((void*)0) 或是 0

    C++ 并不采用 C 的规则,不允许将 void* 隐式转换为其他类型的指针。 为了使代码 char* c = NULL; 能通过编译,NULL 只能定义为 0。 这样的决定使得函数重载无法区分代码的语义:

    void foo(char *);
    void foo(int);
    

    C++ 建议 NULL 应当定义为 0,所以foo(NULL); 将会调用 foo(int), 这并不是程序员想要的行为,也违反了代码的直观性。0 的歧义在此处造成困扰。

    C++11 引入了新的关键字来代表空指针常数:nullptr,将空指针和整数 0 的概念拆开。 nullptr 的类型为nullptr_t,能隐式转换为任何指针或是成员指针的类型,也能和它们进行相等或不等的比较。 而nullptr不能隐式转换为整数,也不能和整数做比较。

    为了向下兼容,0 仍可代表空指针常数。

    char* pc = nullptr;     // OK
    int * pi = nullptr;     // OK
    int    i = nullptr;     // error
     
    foo(pc);           // 呼叫 foo(char *)
    

     参考:http://zh.wikipedia.org/wiki/C++0x#.E7.A9.BA.E6.8C.87.E6.A8.99

  • 相关阅读:
    Language Integrated Query
    为什么说 LINQ 要胜过 SQL
    LINQ(Language Integrated Query)
    Rx (Reactive Extensions)介绍
    ReactiveX Operators
    ReactiveX
    给 iOS 开发者的 RxSwift(一)
    The features of Swift
    RxSwift源码与模式分析一:基本类
    智力
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3500883.html
Copyright © 2011-2022 走看看