C++学习31:侯捷C++11,14新特性(语法部分)

1 Variadic Templates

第一颗震撼弹!要有模板基础。
前面讲过:分成一个和一包,往往和递归相关。
...的意思:接受任意变化个数的形参
在这里插入图片描述
答PPT上问题:可以并存,没有二义性。一个和一包的形式是更特化的,且3的情况将永远不会被调用
在这里插入图片描述
上图是一个HashTable,有关HashTable的内容前面有所提及,后面也会再讲。这里应从蓝色框框的位置入手,随着箭头感受Variadic Templates的强力。
在这里插入图片描述
上图是一个Tuple,有关Tuple的内容前面有所提及,后面也会再讲。这里的关键点是,比如一共5个东西,让第1个东西继承后面的一包,即后面4个东西。
总结:
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
当数量不限但类型相同时,可使用技巧:Initializer Lists
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 Uniform Initialization

一致性的初始化,在设初值时使用的——变量名后直接放大括号。
在这里插入图片描述
所谓逐一分解,可以理解为 Variadic Templates(但实际上并不是)分成一个和一包。每次使用大括号这一种形式,就会与initializer list相关。
有关initializer list<>:用大括号统一设初值的方法的底层为initializer list<>,可以实现参数个数不定,但类型必须相同,不如Variadic Templates那么强力。
要接受“一个和一包”的东西。
注意:Initializer Lists尽量不要窄化类型。
在这里插入图片描述
在这里插入图片描述
当使用大括号时,initializer list<>会起作用,具体调用例子如下:
在这里插入图片描述
在这里插入图片描述
源码(还可以参见array源码):
在这里插入图片描述
如今所有容器都接受指定任意数量的值用于构造或赋值或insert()或assign();max()和min()也顾意接受任意参数,故initializer list在标准库中有很大的应用。

3 =default,=delete

把这个放在一个比较重要的位置,是因为C++11将BIG THREE变成了BIG FIVE。这里引入BIG FIVE的概念(搬移构造、搬移赋值)
在类的继承中会有价值,一般用在拷贝构造、拷贝赋值、搬移构造、搬移赋值中。
=default表示要编译器默认给的那个,=delete表示不要进行中过程。
在这里插入图片描述
使用见下例:
在这里插入图片描述
对应的会有一些东西:
在这里插入图片描述
在这里插入图片描述

4 Alias Template(template typedef)

给类型一个化名,有点像typedef但并不是,相当于对模板typedef。
在这里插入图片描述
实战中:
在这里插入图片描述
这里介绍一下== template template parameter==,以模板作为模板的参数。
在这里插入图片描述
进而引入Type Alias (similar to typedef)。很像typedef。这里用的是using
在这里插入图片描述
关于using,总结如下:
在这里插入图片描述

5 lambda

lambda可以理解为一个对象,这个对象一般定义成auto类型,用一个中括号表明这是个lambda对象(但后面是一个函数的定义的形式),此对象一般完成一个函数的功能。和函数的不同之处是:lambda的箭头后面才是返回类型。
在这里插入图片描述
最简形式如下:
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一些小细节:

1 Spaces in Template Expressions

C++11中,模板可以拿掉后面的空格了。即不用非要打上一个空格来空开。
在这里插入图片描述

2 nullptr and std:nullptr_t

在之前的版本,NULL倍define成0.。故空指针和数值0有时会产生二义。C++11使用nullptr而不是0或NULL来指定指针不引用任何值(这与具有未定义的值不同)。此新功能特别有助于避免将空指针解释为整数值时发生的错误。因此,笔者认为,现在最好改掉曾经的习惯,在想用NULL时改使用nullptr
在这里插入图片描述

3 Automatic Type Deduction with auto

auto关键字:让编译器来进行参数的类型。不建议经常使用这个,自己最好完全知道变量的类型,不用这个屠龙宝刀,尽量只在类型超级长的时候懒得打时才使用auto。
在这里插入图片描述
在这里插入图片描述

4 explicit for ctors taking more than one argument

explicit的作用时禁止类型转换,之前的版本如下例:
在这里插入图片描述
之前只对单一实参有效,C++11对任何多个实参都可。

5 range-based for statement

for循环的特殊形式:
在这里插入图片描述
注:explicit有特殊情况,auto时会发生类型的转换,这里要小心
在这里插入图片描述

6 noexcept

noexcept和“异常”相关。对一个函数后面大括号前面写上noexcept,表示保证这个函数不会丢出异常。
在这里插入图片描述
发生的情况:如标准库的vector和deque
在这里插入图片描述

7 override

应用于虚函数。子类对父类的继承,使用override可以让子类告诉编译器,要完全复写父类的虚函数,避免错误。
在这里插入图片描述

8 final

用在不允许继承的类或不允许被复写的虚函数上。
在这里插入图片描述

9 decltype

定义一个类型,让这个类型表示一个表达式
在这里插入图片描述
声明返回类型:一个表达式的类型
在这里插入图片描述
在元编程(模板)中有很多的应用
在这里插入图片描述
对lambda进行传递
在这里插入图片描述

10 C++关键字

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值