c++ 11新特性总结_C++11新的特性

常用的特性,主要掌握四个方面就行。

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/79969012​blog.csdn.net

④初始化列表

https://blog.csdn.net/lws123253/article/details/80368047​blog.csdn.net

2,右值引用与移动语义

①右值引用

先说一下右值与左值的区别:

左值:代表一个在内存中占有确定位置的对象(换句话说就是有一个地址)。

右值:通过排他性来定义,每个表达式不是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_ptr​www.cnblogs.com https://blog.csdn.net/lym940928/article/details/88859131​blog.csdn.net

4,多线程

#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新特性梳理 - 杭河苇 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值