【C++ 11】一篇文章带你了解C++11新特性

探讨 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 库

  • 41
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值