探讨 C++11 新标准
-
新类型
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 库