1 auto自动推导
C++11允许你声明一个变量或对象而不需要指明其类型,只需说他是auto,例如:
auto i=5;
double f();
auto d=f();
以auto声明的变量,其类型会根据其初始值被自动推导出来,因此一定需要一个初始化的操作:
auto i;
static auto d=0.19;
vector<int> v;
auto pos=v.begin();
auto lamd=[](int x){retrun x;};
auto的限制:
- auto的使用必须马上初始化,否则无法推导出类型 auto在一行定义多个变量时,各个变量的推导不能
- 产生二义性,否则编译失败
- auto不能用作函数参数 在类中auto不能用作非静态成员变量 auto不能定义数组,可以定义指针
- auto无法推导出模板参数
int i=0;
auto *a = &i;
auto &b = i;
auto c = b;
const auto d = i;
auto e = d;
const auto& f = e;
auto &g = f;
2 一致性初始化与初值列
2.1 一致性初始化
在C++11之前,变量的初始化有许多方式 (如小括号,大括号,赋值号),且不同变量和类又有不同的初始化方式。(如,结构体能用{}初始化,类用{}则会出错。)
float f=1;
int i(1);
double d = double(1.88);
struct student={"name","age"};
class animal=("foots","eyes","tail");
2.2.1大括号初始化有三种形式:
int width{5};
int height = { 6 };
int depth {};
这样很容易混淆,为此,C++11引入了“一致性初始化”,意思是面对任何初始化动作,你可以使用相同的豫发,也就是使用大括号,一下借成立:
int value[] {1,2,3};
vector<int>v{1,2,3};
compelx<double>c{2.0,3.0};
2.2 窄化
也就是其精度降低或造成数值变动——对大括号而言是不成立的,例如:
int x(1.2)
int x2=8.3;
int x3{9.0}
char c{3};
char c1{9999};
3 Range-Based for 循环
C++ 11引入了一种崭新的for循环形势,可以逐一迭代某个给定的区间,数组,集合内的每一个元素语法如下:
for(decl: coll)
{
statement
}
其中decl是给定coll集合中每个元素的声明,针对这些元素,给定的statement会被执行,例如下面针对vector向量,调用给定的语句,会输出每一项:
std::vector<int>v{1,2,3,4};
for(int i:v)
{
std::cout<<i<<endl;
}
for(auto &elem:v)
{
elem*=3;
}
这里“声明elem”为一个引用,如果不这么做,for循环的语句或作用在元素的一份local copy身上
后续会续写······
|