C++ 11 笔记
constexpr 表达式
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式.
|
|
using 别名声明
C++ 11规定了一种新的方法, 使用别名声明来定义类型的别名:
|
|
auto 类型说明符
auto能让编译器去推断表达式所属的类型, 使用auto能在一条语句中声明多个变量, 但是该语句中所有变量的初十基本数据类型都必须一样:
decltype 类型指示符
decltype, 它的作用是选择并返回操作数的数据类型. 在此过程中, 编译器分析表达式并得到它的类型, 却不实际计算表达式的值:
|
|
注意: decltype(*p) 解引用操作符会返回一个引用类型.
for range
|
|
如果要改变循环的值:
赋值运算符
C++ 11 允许使用花括号括起来的初始值列表, 作为赋值语句的右侧运算对象:
|
|
initializer_list 形参
如果函数的实参数量未知, 但是全部实参的类型都相同, 可以使用initializer_list类型的形参.
|
|
列表初始化返回值
C++ 11 规定, 函数可以返回花括号包围的值的列表.
|
|
= default
c++ 11中, 如果我们需要默认的构造函数行为, 那么可以通过在参数列表后面写上= default
来要求编译器生成构造函数.其中= default
既可以和声明一起出现在类的内部, 也可以作为定义出现在类的外部. 如果出现= default
在内部, 那么默认构造函数是内联的, 如果在类外部, 那么该成员默认情况下不内联.
|
|
委托构造函数
委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程, 或者说它把它自己的一些(或者全部)职责委托给了其他构造函数.
|
|
容器emplace操作
新标准引入了三个心成员— emplace_front, emplace和emplace_back, 这些操作构造而不是拷贝元素, 这些操作分别对应push_front, insert和push_back, 允许我们将元素放置在容器头部, 一个指定位置之前或容器尾部.(省去了一次拷贝)
|
|
string 和 数值之间的转换
|
|
lambda (详见 p346页)
一个lambda表达式表示一个可调用的代码单元, 我们可以将其理解为一个未命名的内联函数.与任何函数类似, 一个lambda具有一个返回类型, 一个参数列表和一个函数体. 但与函数体不同, lambda可能定义在函数内部, 一个lambda表达式具有如下形式:
|
|
其中capture list 是一个lambda所在函数中定义的局部变量列表, 通常为空, return type, parameter list 和 function body与任何普通函数一样, 分表表示返回类型, 参数列表和函数体. 但是与普通函数不同, lambda必须使用尾置返回来指定返回类型
|
|
如果忽略返回类型, lambda根据函数体中的代码推断出返回类型.
bind 函数
可以将bind函数看做一个通用的函数适配器, 它接受一个可调用的对象, 生成一个新的可调用对象来适应原对象的参数列表.调用bind的一般形式为:
其中, newCallable本身是一个可调用对象, arg_list是一个逗号分隔的参数列表, 对应给定的callable的参数. 即, 当我们调用newCallable时, newCallable会调用callable, 并传递给它arg_list中的参数.
arg_list中的参数可能包含形如_n的名字, 其中n是一个正数, 这些参数是占位符, 表示newCallable的参数, 它们占据了传递给newCallable的参数的”位置”. 数值n表示生成的可调用对象中参数的位置: _1为newCallable的第一个参数, _2为第二个参数, 依此类推(详见P354)
std::move
详见P469
右值引用
为了支持移动操作, 新标准引入了一种新的引用类型—右值引用. 所谓右值引用就是必须绑定到右值的引用. 我们通过&&而不是&来获得右值引用. 右值引用有一个重要的性质—只能绑定到一个将要销毁的对象.因此, 我们可以自由的将一个右值引用的资源”移动” 到另一个对象中.
详见P471
移动构造函数和移动赋值运算符
类似拷贝构造函数, 移动构造函数的第一个参数是该类类型的一个引用. 不同于拷贝构造函数的是, 这个引用参数在移动构造函数中是一个右值引用. 与拷贝构造函数一样, 任何额外的参数都必须有默认实参.
|
|
编译器会合成移动构造函数和移动赋值运算符, 但是如果一个类定义了自己的拷贝构造函数, 拷贝赋值运算符或者析构函数, 编译器就不会为它生成移动构造函数和移动赋值运算符了.(在需要移动构造函数的时候, 会调用拷贝构造函数来代替)
引用限定符
|
|
防止继承的发生
C++11定义了一种防止继承发生的方法, 即在类名后跟一个关键字final:
|
|
override 说明符
新标准中, 可以使用override关键字来说明派生类中的虚函数. 如果我们使用override标记了某函数, 但该函数并没有覆盖已存在的虚函数, 此时编译器会报错: