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,能隐式转换为任何指针可能成员指针的花色,也克和它们进行相等或不同的比较。C++
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的概念,”:”左边的变量为吃遍历序列的单个元素,”:”右边的变量为序列本身。