C++ primer plus--探讨 C++ 新标准

18 探讨 C++ 新标准

18.1 复习前面介绍过的 C++11 功能

(1)C++11 扩大了列表初始化的适用范围,使用初始化列表时,可以不加等号。

int x = {5};
float y {1.1};
short arr[5] {1, 2, 3, 4, 5};
int* ar = new int[4] {1, 2, 3, 4};
vector a{1, 2};

(2)auto 可自动推断类型。

(3)nullptr:空指针是不会指向任何有效数据的指针。

18.2 移动语义和右值引用

(1)左值引用与右值引用

  • 左值:可以取地址的、有名字的、非临时的;

  • 右值:不可取地址、没有名字的、临时的,如立即数、函数返回值等

1)左值引用

左值引用在汇编层面其实和普通的指针是一样的,引用就是该变量的别名,因此需要知道被引用变量的地址。

左值引用示例:

int a = 10;
int& b = a;  //定义左值并引用

int& c = 10;   //错误的,无法对 10 进行取地址操作

2)右值引用

类型 && 引用名 = 右值表达式;

int && b = 10;   //对 10 进行引用,其生存周期也会延长

通过右值引用,原本会被销毁的右值的生存周期会延长至与其绑定的右值引用一致。

18.3 新的类功能
18.4 Lambda 函数

Lambda 函数就地定义匿名目标函数,不需要额外写一个命名函数;可以使代码更加紧凑、简洁,增强可读性。适合用于写一些简单的函数。

参考:http://c.biancheng.net/view/3741.html

https://zhuanlan.zhihu.com/p/384314474

完整的 Lambda 表达式形式如下:

  • capture:捕获列表,可以将局部自动变量传入 Lambda 表达式内部;其中:
    [] 不捕获任何变量;
    [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获);
    [=] 捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获);
    [=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获 foo 变量;
    [bar] 按值捕获 bar 变量,同时不捕获其他变量。

  • parameters:传入参数,和普通函数一样;

  • mutable:可省略,该关键字允许在函数体内修改按值捕获的参数,但这种改变并不能传递到定义体之外(即原参数并不会改变,改变的是传入的副本)。

  • return_type:函数返回值类型,视情况可以省略;

  • statement:函数体。

示例:

bool func(int x) {return x%3==0;}

//写成 Lambda 函数
[](int x) -> bool{return x%3==0;}

//能被3整除的元素个数
std::vector nums;
counts = std::count_if(nums.begin(), nums.end(), [](int x) -> bool{return x%3==0;});
18.5 包装器
18.6 可变参数模板
18.7 C++11 新增的其他功能
18.8 语言变化

你可能感兴趣的:(C++,c++)