zoukankan      html  css  js  c++  java
  • C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)

    3.空指针(nullptr)

    早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分。 C 使用 preprocessor macroNULL 表示空指针, 让 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(nullptr);           // 呼叫 foo(char *)

     4.基于范围的for循环(Range-based for loops)

    C++11给for循环定义了"range"的概念,这样可以使for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(有迭代器Iterator),示例代码如下:

    int my_array[5] = {1, 2, 3, 4, 5};
    for (int &x : my_array)
    {
      x *= 2;
    }
    map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};  
    for (auto p : m){  
        cout<<p.first<<" : "<<p.second<<endl;  
    } 

    C++11使用":"来定义range的概念,":"左边的变量为被遍历序列的单个元素,":"右边的变量为序列本身。

  • 相关阅读:
    WPF之长短
    MFC程序和Win32程序的关系
    .NET Framework/CLR之长短
    常用软件
    经典推荐.Net面试法宝
    socket编程原理
    常用开发工具
    Get和Post方法的区别
    MAC IP等相关
    Datagrid为什么不自动换行显
  • 原文地址:https://www.cnblogs.com/andyidea/p/4785243.html
Copyright © 2011-2022 走看看