1.auto关键字
语法:auto declarator initializer;
作用:在变量声明并初始化时自动推导类型,可提高编码效率
适用场合:替换书写复杂的声明,比如声明迭代器
使用举例:
vector<int> v1;
//用auto可简化声明迭代器
//老写法:vector<int>::iterator it = v1.begin();
auto it = v1.begin();
2.decltype关键字
语法:decltype( expression )
作用:推导表达式的类型,提高代码可读性
适用场合:1.简化长类型变量的声明 2.宏定义 3.用于模板 4.获取不确定变量的类型
使用举例:
typedef decltype(NULL) TYPE_OF_NULL;
3.返回类型后置语法
语法:
auto function_name(params) -> decltype (expression)
{
function_body
};
作用:解决函数返回值类型依赖于参数,所导致的难以确定返回值类型的问题
适用场合:定义模板函数时,返回值类型依赖模板的参数
使用举例:
template<typename A, typename B>
auto add(A a, B b) -> decltype(a + b)
{
return a + b;//使用模板时返回类型难以确定,返回类型后置语法可以解决这类问题
}
4.模板别名
语法:using new_type = old_type
作用:1.提高代码可读性 2.提高编码效率
适用场合:1.需要用typedef的情况 2.对参数较多的模板,传入默认参数
使用举例:
using uintType = unsigned int;//等价于typedef unsigned int uintType;
uintType a = 3;
template<typename T>
using int_map = map<int, T>;//这种格式用template定义的叫做模板别名,既不是函数模板也不是类模板
int_map<double> map1;//等价于map<int,double> map1;
5.列表初始化
语法:变量名 {初始化值} 或 变量名 = {初始化值}
作用:
1.提供一种统一的形式,可以对内置类型,结构体,数组,对象,容器等进行初始化
2.防止类型收窄(类型收窄:导致数据内容发生变化或精度丢失的隐式类型转换,出现类型收窄时编译会报错)
适用场合:所有需要初始化的地方
使用举例:
class Person
{
public:
int age;
Person(int _age)
{
age = _age;
}
};
int main()
{
int a { 10 };
int array[]{ 1,3,5 };
vector<int> v1{ 2,4,6 };
Person p1{ 99.5 };//报错:从“double”转换到“int”需要收缩转换
int b{ 2.8 }; //报错:从“double”转换到“int”需要收缩转换
}
6.基于范围的for循环
语法:for ( for-range-declaration : expression ) {statement}
for-range-declaration :声明一个变量代表容器中的元素
expression :容器名称
作用:简化循环写法,提高编码效率
说明:1.冒号前面的局部变量声明只要求能够支持容器类型的隐式转换
2.迭代时修改容器可能会导致一些意料之外的结果,良好的习惯是不要在迭代过程中修改迭代的容器
适用场合:需要从头到尾遍历容器时
不适用场合:1.只需要遍历容器的局部范围
2.循环语句运算和下标索引有关
使用举例:case1
int arr[] { 10,20,30 };
for (int i : arr)
{
cout << i << endl;//输出10,20,30
}
vector<int> vec { 1, 3, 5 };
for (auto i : vec)
{
cout << i << endl;//输出1,3,5
}
只读容器的写法,声明的容器元素可以用auto自动推导其类型
case2
int arr[] { 10,20,30 };
for (int i : arr)
{
i++;
cout << i << endl;//输出11,21,31
}
for (int i=0;i<=2;i++)
{
cout << arr[i] << endl;//输出10,20,30
}
从结果上来开,在范围for循环体内对容器中元素的值修改后,并没有改变元素本身。因为冒号前面的变量本质是地址不同于容器元素的一个局部变量,其值等于每次遍历时元素的值
case3
int arr[] { 10,20,30 };
for (int &i : arr)
{
i++;
cout << i << endl;//输出11,21,31
}
for (int i=0;i<=2;i++)
{
cout << arr[i] << endl;//输出11,21,31
}
若要在for循环体内修改元素的值,需要通过引用声明冒号前面的变量,这样每次循环时该引用代表元素本身。
适用场合: