C语言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的定义,”:”左边的变量为叫遍历序列的么元素,”:”右边的变量为序列本身。