C11的新特性

  • Post author:
  • Post category:其他

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;//变成失效指针


版权声明:本文为hefngs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。