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

文章目录

  • 1 Variadic Templates
  • 2 Uniform Initialization
  • 3 =default,=delete
  • 4 Alias Template(template typedef)
  • 5 lambda
  • 一些小细节:
    • 1 Spaces in Template Expressions
    • 2 nullptr and std:nullptr_t
    • 3 Automatic Type Deduction with auto
    • 4 explicit for ctors taking more than one argument
    • 5 range-based for statement
    • 6 noexcept
    • 7 override
    • 8 final
    • 9 decltype
    • 10 C++关键字

1 Variadic Templates

第一颗震撼弹!要有模板基础。
前面讲过:分成一个和一包,往往和递归相关。
...的意思:接受任意变化个数的形参

答PPT上问题:可以并存,没有二义性。一个和一包的形式是更特化的,且3的情况将永远不会被调用

上图是一个HashTable,有关HashTable的内容前面有所提及,后面也会再讲。这里应从蓝色框框的位置入手,随着箭头感受Variadic Templates的强力。

上图是一个Tuple,有关Tuple的内容前面有所提及,后面也会再讲。这里的关键点是,比如一共5个东西,让第1个东西继承后面的一包,即后面4个东西。
总结:

例子:

C++学习31:侯捷C++11,14新特性(语法部分)_第1张图片
当数量不限但类型相同时,可使用技巧:Initializer Lists

C++学习31:侯捷C++11,14新特性(语法部分)_第2张图片


2 Uniform Initialization

一致性的初始化,在设初值时使用的——变量名后直接放大括号。

所谓逐一分解,可以理解为 Variadic Templates(但实际上并不是)分成一个和一包。每次使用大括号这一种形式,就会与initializer list相关。
有关initializer list<>:用大括号统一设初值的方法的底层为initializer list<>,可以实现参数个数不定,但类型必须相同,不如Variadic Templates那么强力。
要接受“一个和一包”的东西。
注意:Initializer Lists尽量不要窄化类型。
C++学习31:侯捷C++11,14新特性(语法部分)_第3张图片
C++学习31:侯捷C++11,14新特性(语法部分)_第4张图片
当使用大括号时,initializer list<>会起作用,具体调用例子如下:
C++学习31:侯捷C++11,14新特性(语法部分)_第5张图片
C++学习31:侯捷C++11,14新特性(语法部分)_第6张图片
源码(还可以参见array源码):
C++学习31:侯捷C++11,14新特性(语法部分)_第7张图片
如今所有容器都接受指定任意数量的值用于构造或赋值或insert()或assign();max()和min()也顾意接受任意参数,故initializer list在标准库中有很大的应用。

3 =default,=delete

把这个放在一个比较重要的位置,是因为C++11将BIG THREE变成了BIG FIVE。这里引入BIG FIVE的概念(搬移构造、搬移赋值)
在类的继承中会有价值,一般用在拷贝构造、拷贝赋值、搬移构造、搬移赋值中。
=default表示要编译器默认给的那个,=delete表示不要进行中过程。
C++学习31:侯捷C++11,14新特性(语法部分)_第8张图片
使用见下例:

对应的会有一些东西:

C++学习31:侯捷C++11,14新特性(语法部分)_第9张图片

4 Alias Template(template typedef)

给类型一个化名,有点像typedef但并不是,相当于对模板typedef。
C++学习31:侯捷C++11,14新特性(语法部分)_第10张图片
实战中:

这里介绍一下== template template parameter==,以模板作为模板的参数。
C++学习31:侯捷C++11,14新特性(语法部分)_第11张图片
进而引入Type Alias (similar to typedef)。很像typedef。这里用的是using
C++学习31:侯捷C++11,14新特性(语法部分)_第12张图片
关于using,总结如下:
C++学习31:侯捷C++11,14新特性(语法部分)_第13张图片

5 lambda

lambda可以理解为一个对象,这个对象一般定义成auto类型,用一个中括号表明这是个lambda对象(但后面是一个函数的定义的形式),此对象一般完成一个函数的功能。和函数的不同之处是:lambda的箭头后面才是返回类型。
C++学习31:侯捷C++11,14新特性(语法部分)_第14张图片
最简形式如下:
C++学习31:侯捷C++11,14新特性(语法部分)_第15张图片
例子:
C++学习31:侯捷C++11,14新特性(语法部分)_第16张图片
C++学习31:侯捷C++11,14新特性(语法部分)_第17张图片
C++学习31:侯捷C++11,14新特性(语法部分)_第18张图片

一些小细节:

1 Spaces in Template Expressions

C++11中,模板可以拿掉后面的空格了。即不用非要打上一个空格来空开。
C++学习31:侯捷C++11,14新特性(语法部分)_第19张图片

2 nullptr and std:nullptr_t

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

3 Automatic Type Deduction with auto

auto关键字:让编译器来进行参数的类型。不建议经常使用这个,自己最好完全知道变量的类型,不用这个屠龙宝刀,尽量只在类型超级长的时候懒得打时才使用auto。
C++学习31:侯捷C++11,14新特性(语法部分)_第21张图片
C++学习31:侯捷C++11,14新特性(语法部分)_第22张图片

4 explicit for ctors taking more than one argument

explicit的作用时禁止类型转换,之前的版本如下例:
C++学习31:侯捷C++11,14新特性(语法部分)_第23张图片
之前只对单一实参有效,C++11对任何多个实参都可。

5 range-based for statement

for循环的特殊形式:
C++学习31:侯捷C++11,14新特性(语法部分)_第24张图片
注:explicit有特殊情况,auto时会发生类型的转换,这里要小心
C++学习31:侯捷C++11,14新特性(语法部分)_第25张图片

6 noexcept

noexcept和“异常”相关。对一个函数后面大括号前面写上noexcept,表示保证这个函数不会丢出异常。
C++学习31:侯捷C++11,14新特性(语法部分)_第26张图片
发生的情况:如标准库的vector和deque

7 override

应用于虚函数。子类对父类的继承,使用override可以让子类告诉编译器,要完全复写父类的虚函数,避免错误。
C++学习31:侯捷C++11,14新特性(语法部分)_第27张图片

8 final

用在不允许继承的类或不允许被复写的虚函数上。
C++学习31:侯捷C++11,14新特性(语法部分)_第28张图片

9 decltype

定义一个类型,让这个类型表示一个表达式

声明返回类型:一个表达式的类型
C++学习31:侯捷C++11,14新特性(语法部分)_第29张图片
在元编程(模板)中有很多的应用
C++学习31:侯捷C++11,14新特性(语法部分)_第30张图片
对lambda进行传递
C++学习31:侯捷C++11,14新特性(语法部分)_第31张图片

10 C++关键字

C++学习31:侯捷C++11,14新特性(语法部分)_第32张图片

你可能感兴趣的:(侯捷老师C++)