C语言C++ 1一 学习二:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)

3.空指针(nullptr)

早在 一⑨七一 年,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++1一 引进了新的要害字来表示空指针常数:nullptr,将空指针和整数 0
的概念拆开。 nullptr 的花色为nullptr_t,能隐式转换为任何指针可能成员指针的体系,也能和它们进行相等或不一致的可比。
nullptr不可能隐式转换为整数,也无法和整数做比较。

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

char* pc = nullptr;     // OK
int * pi = nullptr;     // OK
int    i = nullptr;     // error

foo(nullptr);           // 呼叫 foo(char *)

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

C++1一给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++1一施用”:”来定义range的定义,”:”左侧的变量为被遍历种类的单个成分,”:”左边的变量为系列本人。