首页 > 编程语言 >C++11新特性

C++11新特性

时间:2023-07-31 10:25:58浏览次数:36  
标签:11 std 变量 int 特性 线程 C++ ptr 函数

一.智能指针

1.std::shared_ptr

  shared_ptr使用了引用计数,每一个shared_ptr的拷贝都指向相同的内存,每次拷贝都会触发引用计数+1,每次生命周期结束析构的时候引用计数-1,在最后一个shared_ptr析构的时候,内存才会释放。

2.std::weak_ptr

  weak_ptr是用来监视shared_ptr的生命周期,它不管理shared_ptr内部的指针,它的拷贝的析构都不会影响引用计数,纯粹是作为一个旁观者监视shared_ptr中管理的资源是否存在,可以用来返回this指针和解决循环引用问题。

3.std::unique_ptr

  unique_ptr是一个独占型的智能指针,它不允许其它智能指针共享其内部指针,也不允许unique_ptr的拷贝和赋值。使用方法和shared_ptr类似,区别是不可以拷贝。

二.类型推导

1.auto

  让编译器在编译器就推导出变量的类型,可以通过=右边的类型推导出变量的类型。

2.decltype

  相对于auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算。

三.右值引用

  • 左值:可以取地址并且有名字的东西就是左值。

  • 右值:不能取地址的没有名字的东西就是右值。

  • 纯右值:运算表达式产生的临时变量、不和对象关联的原始字面量、非引用返回的临时变量、lambda表达式等都是纯右值。

  • 将亡值:可以理解为即将要销毁的值。

  • 左值引用:对左值进行引用的类型。

  • 右值引用:对右值进行引用的类型。

  • 移动语义:转移资源所有权,类似于转让或者资源窃取的意思,对于那块资源,转为自己所拥有,别人不再拥有也不会再使用。

  • 完美转发:可以写一个接受任意实参的函数模板,并转发到其它函数,目标函数会收到与转发函数完全相同的实参,通过std::forward()实现。

  • 返回值优化:当函数需要返回一个对象实例时候,就会创建一个临时对象并通过复制构造函数将目标对象复制到临时对象,这里有复制构造函数和析构函数会被多余的调用到,有代价,而通过返回值优化,C++标准允许省略调用这些复制构造函数。

四.范围for循环

  for循环基于范围的迭代写法,for(变量:对象)表达式

vector<int> vec;

for (int i : vec) { // c++11基于范围的for循环   

  cout << "i" << endl; }

五.nullptr

  c++11用来表示空指针新引入的常量值,在c++中如果表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型的0,不同的编译器对其定义不同,有的定义为((void*)0),有的定义为0,所以可能会有二义性。

六.并发

1.std::thread

thread t(func);//创建一个线程t,执行func函数。

  这里需要注意的是,如果线程对象t生命周期结束调用析构函数清理资源,但是线程函数func还没有执行完,则运行时会崩溃。这里有两种解决办法,一个是调用join(),保证线程函数的生命周期和线程对象的生命周期相同,另一个是调用detach(),将线程和线程对象分离,这里需要注意,如果线程已经和对象分离,那我们就再也无法控制线程什么时候结束了,不能再通过join来等待线程执行完。

2.lock_guard

  是⼀个互斥量包装程序,它提供了⼀种⽅便的RAII(Resource acquisition is initialization )风格的机制来在作⽤域块的持续时间内拥有⼀个互斥量。创建lockguard对象时,它将尝试获取提供给它的互斥锁的所有权。当控制流离开lockguard对象的作⽤域时,lock_guard析构并释放互斥量。

3.unique_lock

  lockguard 的升级加强版,它具有 lock_guard 的所有功能,同时又具有其他很多方法,相比于std::unique_lock更加轻量级,少了一些成员函数,std::unique_lock类有unlock函数,可以手动释放锁,所以条件变量都配合std::unique_lock使用,而不是std::lock_guard,因为条件变量在wait时需要有手动释放锁的能力

七.lambda表达式

  语法格式为

auto func = [capture](params) opt -> return {func_body;};

  其中func可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表,params是参数表,opt是函数选项(mutable之类), ret是返回值类型,func_body是函数体,只有capture和{func_body}是必选的。一个完整的lambda表达式如下:

auto func1 = [](int a) -> int { return a + 1; };

auto func2 = [](int a) { return a + 2; };

  lambda表达式允许捕获一定范围内的变量:

  • []不捕获任何变量
  • [&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用
  • [=]值捕获,捕获外部作用域所有变量,在函数内内有个副本使用
  • [=, &a]值捕获外部作用域所有变量,按引用捕获a变量
  • [a]只值捕获a变量,不捕获其它变量
  • [this]捕获当前类中的this指针

  还可以使用lambda表达式自定义stl的规则。

八.列表初始化

  直接在变量名后面加上初始化列表来进行对象的初始化。

struct A {

public:

   A(int) {}

private:

   A(const A&) {}

};

int main() {

   A a(123);

   A b = 123; // error

   A c = { 123 }; A d{123}; // c++11

   int e = {123};

   int f{123}; // c++11 return 0; }

 

标签:11,std,变量,int,特性,线程,C++,ptr,函数
From: https://www.cnblogs.com/lhiker/p/17592716.html

相关文章

  • 代码随想录-哈希表-c++总结
    哈希表内容整体简单,关键是要有利用map映射的思想,以及巩固一些c++标准库的操作这次三数之和一题没有直接做出来,关键在于如何查重一点比较绕15.三数之和-力扣(LeetCode)利用排序+双指针解决三数之和的思路更加清楚此外,四数之和中,四个数相加会溢出int,应改为 ......
  • 【C++学习之路】#include头文件包含
    头文件包含:在预处理结果将头文件的内容原封不动包含在目标文件中#include建议<>包含系统头文件<>从系统指定目录寻找head.h头文件#include"head.h"建议“”包含自定义头文件“”先从当前目录寻找head.h头文件,如果找不到,再到系统指定的目录下寻找......
  • vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识
    vs中创建Filter在一个新项目中右键-Add-New,默认只有一选项NewFilter。创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而是修改了.filters文件,把这种目录关系记录在.filters文件中。新建一个vc++project,默认有这几种Filter,当然在实际的......
  • C++ 核心指南之 C++ P.哲学/基本理念(上)
    C++核心指南(C++CoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C++指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C++”。这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静......
  • 11-MySQL数据库的存储过程
    11-MySQL数据库的存储过程课程目标了解存储过程简介、关于MySQL的存储过程。掌握MySQL存储过程的创建、调用、查询、修改、删除、控制语句、基本函数。11.1存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完......
  • C++ Primer 学习笔记——第八章
    第八章IO库前言C++语言并不会直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备中读取数据、向设备写入数据IO操作。设备可以是文件、控制台窗口等,还有一些类型允许内存IO。IO库定义了读写内置类型值的操作。8.1IO类在之前我们使用的IO类型......
  • 微软开测“Moment4”启动包:Win11 23H2要来了
    近日,有用户在Win11最新的7月累积更新中发现,更新文件中已经开始出现了对“Moment4”的引用。具体来说,在7月累积更新中,微软加入了“Microsoft-Windows-UpdateTargeting-ClientOS-SV2Moment4-EKB”“Microsoft-Windows-23H2Enablement-Package”的启用包。类似的情况曾经在Windows......
  • 为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用
    微软日前确认今年4季度推出Win1123H2,这是Win11第二个年度更新。Win1123H2具体有哪些功能升级,现在还不好说,但它会集成微软的Copilot,它很容易让人想到多年前的“曲别针”助手,但这次是AI技术加持的,Copilot就是BingAI聊天的Windows桌面版,基于GPT-4打造,它可以帮助你自动化各种任务,......
  • 110. 平衡二叉树
    给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true#Definitionforabinarytreenode.#classTreeNode:#def__init__(se......
  • C++入门:命名空间
    在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。1.命名空间的定义定义命名空间,需要使用到namespace关键字,......