第一天

c++11新特性

自动类型推导 (auto)

编译期间
auto 必须对变量进行初始化
auto 不能在函数的参数使用
auto 不能定义数组

auto ptr = new auto(10); 
std::unique_ptr<int> ptr = std::make_unique<int>(10);
auto ptr = std::make_unique<int>(10);
类型推导 (decltype)

RTTI(Run- Time Type Identification)运行时类型识别
运行时类型识别的缺陷是降低程序运行的效率
推演表达式类型作为变量的定义类型
推演函数返回值的类型
type(decltype()).name() decltype带上参数 否则是函数首地址

基于范围的for循环
for(const auto &:)
{
}

列表初始化

类里面有const成员变量初始化 必须列表初始化

智能指针

内存管理

#include<memory>
shared_ptr use_count获取共享计数值
test *p = new test();
std::share_ptr<test> sp(p);
std::share_ptr<test> sp1(new test());
std::share_ptr<test> sp2(sp);
reset()改变指向 
避免通过同一个裸指针创建多个shared_ptr对象
避免通过this指针创建shared_ptr对象
class CTest:public std::enable_shared_from_this<CTest>
用到this 地方 shared_from_this()
引用计数的递增和递减是原子操作的
std::shared_ptr<int> sp = std::make_shared<int>(18);
weak_ptr
用来表示临时所有权(弱引用,不会增加引用计数) 
需要临时所有权 将其转换为shared_ptr 对象的引用计数会加1
use_count() expired() lock()
//多线程里是危险的 
if(!wp.expired())
{
    std::shared_ptr<int> sp(wp);
}
std::share_ptr<int> sp = wp.lock();
std::this_thread::sleep_for(std::chrono::seconds(3));
避免循环引用
unique_ptr 独占所有权 没有拷贝语义(没有赋值构造函数和赋值函数) 只有移动语义
release() 返回指向被管理对象的指针 并释放所有权
reset()   替换被管理的对象
swap()    交换被管理的对象
std::unique_ptr<CTest>p1(new CTest(1));
std::unique_ptr<CTest>p2(new CTest(2));
p1 = std::move(p2);
p2.reset(p1.release());
release 只是释放所有权 并不会释放对象
容器存入 unique_ptr 需要借助于 std::move
unique_ptr支持动态数组
移动语义与右值引用

避免不必要的深拷贝,提升性能
std::move:将左值转换为右值引用,启用移动语义(不移动任何东西,只是类型转换)
std::forward:完美转发,保持参数原有值类别(左值/右值)

Lambda 表达式

捕获列表 [capture]:
[]:不捕获任何外部变量
[=]:以值捕获所有外部变量
[&]:以引用捕获所有外部变量
[x, &y]:混合捕获
[this]:捕获当前类的this指针

新的容器和算法

无序容器(哈希表):
std::unordered_map<K, V>
std::unordered_set<T>
std::unordered_multimap<K, V>
std::unordered_multiset<T>
std::array<T, N>:固定大小的数组,比原生数组更安全
std::forward_list<T>:单向链表,内存开销更小

多线程支持 需要深入后续再补充

线程管理:std::thread
互斥锁:std::mutex, std::lock_guard, std::unique_lock
条件变量:std::condition_variable
异步操作:std::async, std::future, std::promise
原子操作:std::atomic<T>

nullptr:类型安全的空指针替代NULL宏
constexpr:声明编译期常量表达式
static_assert:编译期断言
override 和 final:明确虚函数重写和禁止继承/重写
委托构造函数:一个构造函数可以调用同一类的另一个构造函数
继承构造函数:使用 using Base::Base; 继承基类构造函数
强类型枚举 enum class

enum class Color { Red, Green, Blue };
Color c = Color::Red; // 必须带作用域,不会隐式转换为整数

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容