C++11的新特性简单汇总介绍 (二)

2020-01-06 15:34:39丽君

1. 范围for语句

C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素


vector<int> vec = {1,2,3,4,5,6};
for(int x: vec)
{
  cout<<x<<endl;
}

2. 尾置返回类型

要想引入尾置类型,我们还得从复杂的类型声明说起。如果我们需要定义一个含有10个int元素的数组,一般是这样的:


int arr[10] = {0};

如果要定义指向这个数组的指针呢:

 

复制代码
int (*p_arr)[10] = &arr; //注意:int *p_arr[10] 表示一个数组,有10个元素,元素类型是int*

 

如果要定义一个函数,这个函数接受一个char类型的参数,并返回一个指向10个int类型数组的指针呢:

 

复制代码
int (*func(char x))[10];

 

这样的声明是不是看的头都大了,其实我们可以简化一点,一般情况下我们可以使用别名进行简化,比如:

 

复制代码
typedef int ARR[10] ; // 定义一个类型 ARR这是一个数组类型,含有10个int类型的元素
using ARR = int[10] ; // 同上

 

再定义如上的函数:

 

复制代码
ARR * func(char x) ; // 函数返回的类型是 ARR* 也就是指向具有10个int元素数组的指针

 

当然在C++11中我们可以用之前讲到过的另外一个关键字decltype:

 

复制代码
decltype(arr) * func(char x) ; // decltype(arr)表达式会获得arr的类型

 

最后就轮到我们本节要说的C++11的另外一个特性,尾置返回类型,任何函数都可以使用尾置返回类型,这种形式对于返回类型比较复杂的函数最有效,比如上面的函数可以使用如下方式:

 

复制代码
auto func(char x) -> int(*) [10];

 

这种形式将函数的返回类型写在函数声明的最后面,并且在函数形参列表后面加上 -> 符号,然后紧接着是函数需要返回的类型,由于函数的返回类型被放在了形参列表之后,所以在函数名前面使用一个 auto替代。

3. =default 生成默认构造函数

在C++的类中,如果我们没有定义构造函数,编译器会为我们合成默认的无参构造函数,如果我们定义了构造函数,则编译器就不生成默认构造函数了,但是如果我们定义构造函数同时也希望编译器生成默认构造函数呢? C++11中可以通过在构造函数的声明中直接  =default的方式要求编译器生成构造函数。


class ClassName{
  public:
    ClassName(int x);
    ClassName()=default; // 显示要求编译器生成构造函数
};