常用的特性,主要掌握四个方面就行。
1,语法糖的增加:nullPtr、auto 自动类型f推导、Lamda表达式、范围for循环、初始化列表我这里将主要几个:
①auto类型自动推导
方便遍历STL容器,类型推导在编译阶段,不影响效率。
注意点:
- auto声明的变量必须要初始化,否则编译器不能判断变量的类型。
- auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数
②Lambda表达式
形式捕获区](参数区){代码区};
auto add = [](int a, int b) {return a + b};
注意点:[a,&b] 其中 a 以复制捕获而 b 以引用捕获。
[&] 以引用捕获所有用于 lambda 体内的自动变量,并以引用捕获当前对象,若存在
- [=] 以复制捕获所有用于 lambda 体内的自动变量,并以引用捕获当前对象,若存在
- [] 不捕获,大部分情况下不捕获就可以了
③范围for循环
int Array[]={1,2,3,4,5};
for(auto val:arr)
{
cou<<val<<"";
}
for(auto &val:arr)
{
val=0;
cou<<val<<"";
}
参考:
https://blog.csdn.net/lixiaogang_theanswer/article/details/79969012blog.csdn.net④初始化列表
https://blog.csdn.net/lws123253/article/details/80368047blog.csdn.net2,右值引用与移动语义
①右值引用
先说一下右值与左值的区别:
左值:代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。
右值:通过排他性来定义,每个表达式不是lvalue就是rvalue。也就是不在内存中占有确定位置的表达式。
左值引用:& 右值引用:&&
②移动语义
转移语义可以将资源(堆、系统对象等)从一个对象转移到另一个对象,这样可以减少不必要的临时对象的创建、拷贝及销毁。移动语义与拷贝语义是相对的,可以类比文件的剪切和拷贝。在现有的C++机制中,自定义的类要实现转移语义,需要定义移动构造函数,还可以定义转移赋值操作符。
完美转发:需要将一组参数原封不动地传递给另一个函数。原封不动不仅仅是参数的值不变
还包含:
- 左值/右值
- const / non-const
3,智能指针
- shared_ptr,基于引用计数的智能指针,会统计当前有多少个对象同时拥有该内部指针;当引用计数降为0时,自动释放
- weak_ptr,基于引用计数的智能指针在面对循环引用的问题将无能为力,因此C++11还引入weak_ptr与之配套使用,weak_ptr只引用,不计数
- unique_ptr: 遵循独占语义的智能指针,在任何时间点,资源智能唯一地被一个unique_ptr所占有,当其离开作用域时自动析构。资源所有权的转移只能通过
std::move()
而不能通过赋值
这里说一下weakptr的用法,其实主要是为了解决智能指针不好解决的环形引用问题(会导致内存泄漏),weakPtr一般配合智能指针进行使用,不会导致引用计数的增加
参考:
C++ 11 创建和使用共享 weak_ptrwww.cnblogs.com https://blog.csdn.net/lym940928/article/details/88859131blog.csdn.net4,多线程
#include<thread>
voidfunc()
{
// do some work here
}
int main(){
std::thread thr(func);
t.join();
return0;
}
- joinable(): 判断线程对象是否可以join,当线程对象被析构的时候如果对象`
joinable()==true
会导致std::terminate
被调用。 - join(): 阻塞当前进程(通常是主线程),等待创建的新线程执行完毕被操作系统回收。
- detach(): 将线程分离,从此线程对象受操作系统管辖。
线程管理函数:
get_id返回当前线程的id
yield告知调度器运行其他线程,可用于当前处于繁忙的等待状态。相当于主动让出剩下的执行时间,具体的调度算法取决于实现
sleep_for指定的一段时间内停止当前线程的执行
sleep_until停止当前线程的执行直到指定的时间点
参考:
C++11新特性梳理 - 杭河苇 - 博客园