1.类型推导
auto定义的变量可以根据初始化的值,在编译是推导出变量名的类型。
并不能代表一个实际的类型声明,只是一个类型声明的“占位符”。
使用auto声明的变量必须有初始化值,方便编译器推断出它的实际类型
,并在编译时替换成真正的数据类型。
两条规则:
1)当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致。
2)当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性。
总结:
1、C11中auto成为类型指示符(type-specifier)。
2、auto不能用于函数参数。
3、auto不能用于非静态成员变量
4、auto无法定义数组
5、实例化模板时不能使用auto作为模板参数。
2.decltype关键字
从格式上来看,decltype 很像sizeof-—用来推导表达式类型大小的操作符。类似于sizeof,decltype 的推导过程是在编译期完成的,并且不会真正计算表达式的值。
例:
int main()
{
int x = 10;
decltype(x)y = 1;// y => int
decltype(x+y) Z= 0;// y = int;
const int &i= x;
decltype(i)j= y; //j= const int &;
const decltype(z)*p= &z;// *p=> const int,p= const int*
decltype(z)*ip= &z;//*ip=> int,ip=>int*
decltype(pi)*pp = &ip // *pp => int *,pp → int;
}
3.基于范围的for循环
以下是基于范围的for循环的一般格式:
for(ElemType val:array)
{
...// statement 循环体
}
ElemType∶是范围变量的数据类型。它必须与数组(容器元素的数据类型一样,或者是数组元素可以自动转换过来的类型。
val∶是范围变量的名称。该变量将在循环迭代期间依次接收数组中的元素值。在第一次循环迭代期间,它接收的是第一个元素的值;在第二次循环迭代期间,它接收的是第二个元素的值;以此类推。
array∶是要让该循环进行处理的数组(容器)的名称。该循环将对数组中的每个元素迭代一次。
statement∶是在每次循环迭代期间要执行的语句。要在循环中执行更多的语句,则可以使用一组大括号来包围多个语句。与其他循环体一样,可以用continue来结束本次循环,也可以用break来跳出整个循环。
4.指针空值——nullptr
nullptr是有类型的,且仅可以被隐式转换为指针类型
nullptr和 nullptr_t
C11标准不仅定义了指针空值常量 nullptr,也定义了其指针空值类型 nullptr_t,也就表示了指针空值类型并非仅有 nullptr一个实例。通常情况下,也可以通过nullptr t来声明—个指针空值类型的变量(即使看起来用途不大)。
除去 nullptr及 nullptr t以外,C++中还存在各种内置类型。C++11标准严格规定了数据间的关系。大体上常见的规则简单地列在了下面∶
所有定义为 nullptr_t类型的数据都是等价的,行为也是完全一致。
nullptr_t类型数据可以隐式转换成任意一个指针类型。nullptr_t类型数据不能转换为非指针类型,即使使用的方式也是不可以的
reinterpret_cast<nullptr_t>O);
int main()
{
int a= nullptr;// error;
int *p= nullptr; // ok;
char *cp= nullptr; // ok;
}
nullptr_t类型数据不适用于算术运算表达式。
nullptr_t类型数据可以用于关系运算表达式,但仅能与nullptr t类型数据或者指针类型数据进行较,当且仅当关系运算符为=、<=、>=等时返回 true。
注意∶
1、nullptr 是C11新引入的关键字,是一个所谓”指针空值类型”的常量,在C++程序中直接使用。
2、在C11中,sizeof(nullptr)与sizeof(void*)0)所占的字节数相同都(4,或8)。
3、为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
5.typedef与using
typedef unsigned int uint;
using uint = unsigned int;
template<class__Ty>
using pointer = _Ty *;
int main()
{
int x = 10;
double dx = 12.25;
pointer<int>ip=&x;
pointer<double> dp = &dx;
return 0;
}
指针类型:
野指针:int *p;
空指针:int *sp=nullptr;
失效指针:sp=new int(10); delete sp;//变成失效指针