新类型
long long、unsigned long long、char16_t、char32_t,初始化
列表初始化C++ 11 使用大括号括起来对内置类型和自定义类型进行初始化,使用列表初始化时,可添加“=”,也可不添加“=”
使用案例:
int x = {15}; double y {12.5}; short quar[5] {1, 2, 3, 4, 5}; int* ptr = new int [4] {1, 2, 3, 4}; //创建对象时也可使用大括号而不是圆括号,来调用构造函数 class Stump { public: Stump(int r, double w) :roots(r) ,weight(w) {} private: int roots; double weight; }; Stump s1 {1, 2.3}; Stump s2 {4, 32.1};然而,如果类有将模板initializer_list作为参数的构造函数,则只有该构造函数可以使用列表初始化
std::initializer_list声明 auto以前,关键字 auto作为存储类型说明符,C++11将其用于自动类型推导,这要求进行显示初始化,让编译器能够将变量的类型设置为初始值的类型
使用案例:
auto maton = 112; auto pt = &maton; double fm(double, int);关键字 auto 还可以简化模板声明,例如 il 是一个std::initializer_list<double>对象,则可将下述代码:
for (std::initializer_list<double>::iterator p = il.begin(); p != il.end(); il++) 替换为 for (auto p = il.begin(); p != il.end(); i++) decltype关键字decltype将变量的类型声明为表达式指定的类型,下面语句的含义是,让 y 的类型与 x 相同,其中 x 是一个表达式
decltype(x) y;下面是几个示例
double x; int n; decltype(x * n) q; decltype(&x) pd;这在定义模板时特别有用,因为只有等到模板被实例化后才能确定类型
template<class T, class U> void df(T t, U, u) { decltype(T * U) tu; } //其中 tu 将为表达式 T * U 的类型,这里假定定义了运算 T * U,例如,如果 T 为 char,U 为 short,则 tu 为 int,这是由于整形算术自动提升导致的 nullptr空指针是不会指向有效数据的指针,以前,C++ 在源码中用 0 来表示这种指针,但内部表示可能不同,这将带来一些问题,因为这使得 0 可以表示指针常量,又可表示整型常量,C++ 11 带来了 nullptr,用于表示空指针,它是指针类型,不能转换为整数类型,为了向后兼容 C++ 允许使用 0 来表示空指针,因此表达式 nullptr == 0 为 true,但 nullptr 更为安全
智能指针Class shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。
Class unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如 new 后忘记 delete ——特别有用
shared_ptr 多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。支持定制型删除器(custom deleter),可防范 Cross-DLL 问题(对象在动态链接库(DLL)中被 new 创建,却在另一个 DLL 内被 delete 销毁)、自动解除互斥锁
weak_ptr weak_ptr 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何 weak_ptr 都会自动成空(empty)。因此,在 default 和 copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。可打破环状引用(cycles of references,两个其实已经没有被使用的对象彼此互指,使之看似还在 “被使用” 的状态)的问题
unique_ptr unique_ptr 是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。一旦拥有着被销毁或编程 empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。unique_ptr 用于取代 auto_ptr
auto_ptr 被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move 语义,以及其他瑕疵。
auto_ptr 与 unique_ptr 比较 auto_ptr 可以赋值拷贝,复制拷贝后所有权转移;unqiue_ptr 无拷贝赋值语义,但实现了move 语义; auto_ptr 对象不能管理数组(析构调用 delete),unique_ptr 可以管理数组(析构调用 delete[] ); 强制类型转换运算符
右值引用
Lambda 表达式 Lambda 表达式是什么? [&count](int x){count += (x % 13 == 0);} Lambda表达式提供了一种有用的服务,对使用函数谓词的 STL 算法来说尤其如此 为什么要使用 Lambda 表达式? 怎么用Lambda表达式?
可变参数模板
thread 库