目录
前言
auto就是根据后面的值来推测自己的类型,使用auto可以简化初始化变量,但要注意使用auto一定要初始化。
auto定义
auto在c++11中新定义:用于定义变量的一个占位符,告诉编译器在编译阶段推断初始化表达式的类型来作为变量真正的类型。
例如:
auto a1=10;
auto d1=12.34;
使用auto定义变量是一定要初始化
auto的使用搭配
auto和指针:可以auto一个变量把另一个变量的地址给予其初始化,这时该变量类型是指针
int a=10;
auto pa=&a; //此时pa的类型就是int*
auto* pa=&a; //另一种写法,pa的类型也是int*
auto和引用:和auto不太一样的是auto引用不能缺少&
auto& ra=a; //ra是引用,不能缺少&
注意:
auto不能用作函数形参
auto不能用于直接申明数组,例如:auto arr={1,2,3}; //会报错,此时arr也不是数组
基于范围的for循环
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
例如:
for (int e : arr){ //e就是范围内用于迭代的变量,arr就是被迭代的范围,arr必须是已经确定的
cout << e << " ";
}
cout << endl;
此外,基于范围的for循环还可以用引用和auto来做:
代码
#include <iostream>
using namespace std;
int main(){
int arr[] = { 1, 2, 3 };
for (int e : arr){
cout << e << " ";
}
cout << endl;
for (int& e : arr){//引用
cout << e << " ";
}
cout << endl;
for (auto e : arr){ //auto,这里e是范围中每个元素的拷贝,不能用e修改数组
cout << e << " ";
}
cout << endl;
for (auto& e : arr){ //auto,这里e是范围中每个元素的别名(引用),可以用e修改数组
cout << e << " ";
}
cout << endl;
}
指针空nullptr
引入nullptr的原因:C和C++中的NULL不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。
c++在NULL上不完全兼容c,其根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。
用法:
int *p=nullptr;
注意:
在使用nullptr时不需要包含头文件。
在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。