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; // 必须带作用域,不会隐式转换为整数