【侯捷】C++11
- 0. 课程目标
- 1. 语言
-
- 1.1 Variadic Templates
- 1.2 Spaces in Template Expressions
- 1.3 nullptr and std::nullptr_t
- 1.4 auto
- 1.5 Uniform Initialization
- 1.6 std::initializer_list
- 1.7 explicit
- 1.8 for循环的range-based
- 1.9 =delete, =default
- 1.10 Alias Template
- 1.11 模板模板参数
- 1.12 Type Alias
- 1.13 noexcept
- 1.14 override
- 1.15 final
- 1.16 decltype
- 1.17 lambda
- 1.18 智能指针
- 2. 标准库
- 3. 线程支持库
本系列相关链接:
【侯捷】C++面向对象高级开发
0. 课程目标
较全面地认识C++2.0新特性;
1. 语言
1.1 Variadic Templates
可变长模板参数,将一包参数层层展开,递归;原子弹级武器;
void printX() {
}
template <typename T, typename... Types>
void printX(cont T& firstArg, const Types&... args)
{
cout << firstArg << endl;
printX(args...);
}
1.2 Spaces in Template Expressions
vector<list<int>> t;
1.3 nullptr and std::nullptr_t
用来区别NULL和整数0;
1.4 auto
自动类型推导;
用于数据类型太长或者太复杂;
auto l = [](int x) -> bool {
...};
1.5 Uniform Initialization
统一可以用大括号做初始化,背后其实是initializer_list的形成,被传为一包或者被分解为n个给ctors。
1.6 std::initializer_list
背后其实是array<T,n>,所以个数任意,但是数据类型必须一致;
如今所有容器都接受指定任意数量得值用于构建或赋值或insert()或assign();很多算法如min()、max()、minmax()等也支持;
1.7 explicit
明确禁止ctors做自动隐式转换;
c++11之前explicit只用于只有一个形参的情况,c++11开始支持多个;
1.8 for循环的range-based
vector<double> vec;
for(auto& elem : vec){
...} //引用效率高
1.9 =delete, =default
c++一旦自行定义了一个ctor,强制再加=default,才能拿到默认的ctor.
构造函数可以有多个,但是拷贝构造、拷贝赋值、移动构造、移动赋值、析构都只能有一个;
=0只能用于虚函数后;
1.10 Alias Template
template <typename T>
using Vec = std::vector<T, MyAlloc<T>>;
使用macro或者typedef都无法达到相同的效果;
不仅是少打几个字,
iterator_traits萃取器,可以根据容器迭代器问出元素类型。