当前位置: 首页 > news >正文

【C++进阶】:C++11

C++11

  • 一.统一列表的初始化
    • 1.{}初始化
    • 2.initializer_list
  • 二.声明
    • 1.decltype
    • 2.nullptr
  • 三.右值引用和移动语义
    • 1.左值和右值
      • 1.转义语句
      • 2.完美转发
  • 四.可变参数模板
    • 1.基本概念
    • 2.STL里emplace类接口
  • 五.lambda表达式
  • 六.新的类功能

一.统一列表的初始化

1.{}初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。例如:

在这里插入图片描述

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加

在这里插入图片描述

这里对自定义类型本质是进行了多参数的隐式类型转化。原来的c++只支持单参数的隐式类型转化,例如常量字符串转化成string。

在这里插入图片描述
在这里插入图片描述

2.initializer_list

看一个例子:

在这里插入图片描述

答案是不同的。a2使用的是多参数隐式类型转化,它只能写两个参数。而a1,可以写多个参数,例如可以写成vector< int >a1={1,2,3,4,5,6}。能这样写是因为c++11有一个initializer_list。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

那为什么vector为什么能用initializer_list进行构造呢?当然是因为vector有对应的构造函数了。

在这里插入图片描述

二.声明

1.decltype

关键字decltype将变量的类型声明为表达式指定的类型。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.nullptr

由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。

在这里插入图片描述

三.右值引用和移动语义

1.左值和右值

1.转义语句

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,之前的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。

左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。右值引用就是对右值的引用,给右值取别名。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在以上情况里不能左值引用,因为函数结束后空间会被销毁。这里只能先将返回的s拷贝一份,再对main里s进行拷贝构造。接下来来一个补充知识。

在这里插入图片描述
在这里插入图片描述

为了避免上述多次拷贝造成的浪费,C++11对string进行了修改,多加了一个赋值重载(自定义的右值都是将亡值)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.完美转发

万能引用

在这里插入图片描述

在这里插入图片描述

为什么这里打印出来全是左值呢?为什么不是传右值就接收右值呢?

这是因为虽然我们传的是右值,但接收的t的属性实际上是左值。右值本身不可修改,但右值引用的变量会被编译器识别成左值,否则在移动构造的情况下就无法完成资源的转移。

如果我们想要t保持原有属性呢?

在这里插入图片描述

在这里插入图片描述

上文说到将右值变量强制识别成左值就是为了资源转移,那么这里保持原有属性又是为什么呢?看下面场景。

在这里插入图片描述

四.可变参数模板

1.基本概念

C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改
进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以这块还是比较晦涩的。

在这里插入图片描述

在这里插入图片描述

递归式展开参数包

上面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数 包“,它里面包含了0到N(N>=0)个模版参数。我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特 点,也是最大的难点,即如何展开可变模版参数。由于语法不支持使用args[i]这样方式获取可变 参数,所以我们的用一些奇招来一一获取参数包的值。

在这里插入图片描述

在这里插入图片描述

逗号式展开

这种展开参数包的方式,不需要通过递归终止函数,是直接在expand函数体中展开的, printarg
不是一个递归终止函数,只是一个处理参数包中每一个参数的函数。这种就地展开参数包的方式
实现的关键是逗号表达式。我们知道逗号表达式会按顺序执行逗号前面的表达式。

expand函数中的逗号表达式:(printarg(args), 0),也是按照这个执行顺序,先执printarg(args),再得到逗号表达式的结果0。同时还用到了C++11的另外一个特性——初始化列表,通过初始化列表来初始化一个变长数组, {(printarg(args), 0)…}将会展开成((printarg(arg1),0),(printarg(arg2),0), (printarg(arg3),0), etc… ),最终会创建一个元素值都为0的数组int arr[sizeof…(Args)]。由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)打印出参数,也就是说在构造int数组的过程中就将参数包展开了,这个数组的目的纯粹是为了在数组构造的过程展开参数包。

在这里插入图片描述

在这里插入图片描述

2.STL里emplace类接口

在这里插入图片描述

在这里插入图片描述

例子

在这里插入图片描述

在这里插入图片描述

首先我们看到的emplace系列的接口,支持模板的可变参数,并且万能引用。那么相对insert和
emplace系列接口的优势到底在哪里呢?

在这里插入图片描述

五.lambda表达式

语法形式

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }


例子

在这里插入图片描述

lambda里可不可以再调函数呢?

可以调用全局函数,不能调用局部函数。

在这里插入图片描述

但如果我们需要调用局部数据,可以使用捕捉列表。

捕捉列表

例一:

在这里插入图片描述

例二:

在这里插入图片描述

例三:

在这里插入图片描述

在这里插入图片描述

六.新的类功能

原来C++类中,有6个默认成员函数:

  1. 构造函数
  2. 析构函数
  3. 拷贝构造函数
  4. 拷贝赋值重载
  5. 取地址重载
  6. const 取地址重载

最后重要的是前4个,后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。
C++11 新增了两个:移动构造函数和移动赋值运算符重载

针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:
如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任
意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类
型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,
如果实现了就调用移动构造,没有实现就调用拷贝构造。

如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中
的任意一个,那么编译器会自动生成一个默认移动赋值。默认生成的移动构造函数,对于内
置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋
值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。(默认移动赋值跟上面移动构造
完全类似)如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。

相关文章:

【C++进阶】:C++11

C11 一.统一列表的初始化1.{}初始化2.initializer_list 二.声明1.decltype2.nullptr 三.右值引用和移动语义1.左值和右值1.转义语句2.完美转发 四.可变参数模板1.基本概念2.STL里emplace类接口 五.lambda表达式六.新的类功能 一.统一列表的初始化 1.{}初始化 在C98中&#xf…...

9.30消息队列实现进程之间通信方式代码,现象

服务端 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)typedef struct{ long msgtype; //消息类型char data[1024]; //消息正文 }Msg;#define SIZE sizeof(Msg)-sizeof(long)int main(int argc…...

【Oracle】Oracle系列之十三--游标

文章目录 往期回顾前言1. 游标的定义2. 游标的类型&#xff08;1&#xff09;显式游标&#xff08;2&#xff09;隐式游标 3. 游标的应用&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;数据处理&#xff08;3&#xff09;更新数据&#xff08;4&#xff09;注意事…...

【Linux】——基操指令(二)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 man指令 cp 指令 mv指令 echo指令 cat指令 more指令 less指令 head和tail指令 head指令 tail指令 前言 上篇文章给大家讲解了Linux环境下的一点基操指令&#xf…...

如何用Angular和NativeScript开发IOS程序?

要使用Angular和NativeScript开发iOS应用程序&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装必要的工具&#xff1a; 确保您已经安装了Node.js和npm&#xff08;Node.js包管理器&#xff09;。 安装Angular CLI&#xff1a;如果尚未安装&#xff0c;请运行以下命令…...

python 使用 scapy 扫描内网IP或端口

地址信息在IP层, 可以利用 ICMP 或 ARP 协议数据包探测IP信息. ICMP协议可以利用ping工具发送数据包, 但是防火墙有可能禁止ICMP, 无法有效探测, 可以考虑使用ARP探测. 利用ICMP协议探测内网IP def ping_ip(ip_fex):# 扫描范围: 128~254for i in range(128, 255):ip f{ip_fe…...

14:00面试,14:08就出来了,问的问题有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…...

Spring Security 简单token配置

Spring Security 简单token配置 说明&#xff1a;非表单配置 先上码&#xff1a; https://gitee.com/qkzztx_admin/security-demo/tree/master/demo-two 环境&#xff1a;win10 idea2023 springboot2.7.6 maven3.8.6 代码清单说明 依赖&#xff1a; <dependency><…...

2023 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|数学建模完整代码+建模过程全解全析

F题代码思路 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们一起看看研赛的F题呀&#xff01;全文都已…...

FFmpeg 命令:从入门到精通 | ffplay 简单过滤器

FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器视频旋转视频反转视频旋转和反转音频变速播放视频变速播放音视频同时变速更多参考 FFmpeg 命令&#xff1a;从入门到精通 | ffplay 简单过滤器 本节介绍了简…...

应用在手机触摸屏中的电容式触摸芯片

触控屏&#xff08;Touch panel&#xff09;又称为触控面板&#xff0c;是个可接收触头等输入讯号的感应式液晶显示装置&#xff0c;当接触了屏幕上的图形按钮时&#xff0c;屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置&#xff0c;可用以取代机械式的按钮面板&…...

计算机网络之传输层

计算机网络 - 传输层 计算机网络 - 传输层 UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1. 慢开始与拥塞避免2. 快重传与快恢复 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是…...

vue下载在前端存放的pdf文件

vue下载在前端存放的pdf文件 注意&#xff0c;这里要在public文件夹中新建文件夹存放静态资源&#xff0c;不能在src文件夹中新建文件夹存放静态资源&#xff0c;因为public文件夹中的文件资源不会被npm run build打包编译。大家打包一下&#xff0c;就会发现 模板.pdf文件 是存…...

自学WEB后端05-Node.js后端服务链接数据库redis

嘿&#xff0c;亲爱的小伙伴们&#xff01;&#x1f604; 今天我要给大家分享一个超级方便且高效的 NoSQL 类型数据库——Redis&#xff01;&#x1f4a1; 它可不是一般的关系型数据库哦&#xff0c;而是以键值对形式存储数据的内存数据库。&#x1f4da; 快跟着我一起来学习如…...

【计算机网络】 基于TCP的简单通讯(客户端)

文章目录 流程伪代码代码实现加载库创建套接字连接服务端收发数据关闭套接字、卸载库 测试 流程伪代码 //1、加载库//2、创建套接字//3、连接服务端while(true){//4、发送数据//5、接收数据} //6、关闭套接字、卸载库代码实现 加载库 int err 0;WORD version MAKEWORD(2, 2…...

RabbitMQ配置

centos7安装rabbitmq 官网教程&#xff1a;https://www.rabbitmq.com/install-rpm.html#downloads 官网介绍了两种安装方法&#xff1a; 安装使用yum库中的包&#xff08;强烈建议此选项&#xff09;上Cloudsmith.io或PackageCloud 下载软件包并使用rpm安装它。此选项将需要手…...

火热报名中 | 2天峰会、20+热门议题,AutoESG 2023数智低碳---中国汽车碳管理创新峰会亮点抢先看!

在碳中和的背景下&#xff0c;减碳之风吹遍全球&#xff0c;而汽车行业则由于产业链长、辐射面广、碳排放总量增长快、单车碳强度高的特点&#xff0c;成为各国碳排放管理的监管重点&#xff0c;聚焦汽车业的碳博弈也逐步升级。 2020年&#xff0c;国务院办公厅印发的《新能源…...

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…...

leetCode 188.买卖股票的最佳时机 IV 动态规划 + 状态压缩

给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说&#xff0c;你最多可以买 k 次&#xff0c;卖 k 次。 注意&#xff1a;你不能同时参与多…...

Lua学习笔记:debug.sethook函数

前言 本篇在讲什么 使用Lua的debug.setHook函数 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &…...

信息化发展74

产业数字化 产业数字化是指在新一代数字科技支撑和引领下&#xff0c;以数据为关键要素&#xff0c;以价值释放为核心&#xff0c;以数据赋能为主线&#xff0c;对产业链上下游的全要素数字化升级、转型和再造的过程。产业数字化作为实现数字经济和传统经济深度融合发展的重要…...

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…...

elasticsearch+logstash+kibana整合(ELK的使用)第一课

一、安装elasticsearch 0、创建目录&#xff0c;统一放到/data/service/elk 1、下载安装包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-linux-x86_64.tar.gz2、解压 tar -xzvf elasticsearch-7.1.0-linux-x86_64.tar.gz3、新建用户和组…...

宝塔 php修改了php.ini配置不生效

最近在使用hypref&#xff0c;php的版本是7.4 服务器linux&#xff0c;用宝塔安装完php,并装完swoole插件后 安装了swoole后&#xff0c;需要在php.ini中修改一下配置文件 添加 swoole.use_shortnameOff 但是添加了&#xff0c;重启php,依然不生效 解决方法是&#xff1a; 同时…...

Unrecognized option ‘stream_loop‘.(版本不匹配,利用make编译安装)

执行如下命令&#xff1a; ffmpeg -re -stream_loop -1 -i 1.mp4 -vcodec copy -acodec copy -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live1.sdp报如下错误&#xff1a;Unrecognized option ‘stream_loop’. 查看ffmpeg版本&#xff1a;ffmpeg -version 显示&am…...

【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(2,常见的二维随机变量及二维变量的条件分布和独立性)

文章目录 引言四、常见的二维随机变量4.1 二维均匀分布4.2 二维正态分布 五、二维随机变量的条件分布5.1 二维离散型随机变量的条件分布律5.2 二维连续型随机变量的条件分布 六、随机变量的独立性6.1 基本概念6.2 随机变量独立的等价条件 写在最后 引言 有了上文关于二维随机变…...

力扣 -- 10. 正则表达式匹配

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//处理后续映射关系s s;//处理后续映射关系p p;vector<vector<bool>> dp(m1,vector<bool>(n1));//初始化dp[0][0]true…...

Spring源码分析(四) Aop全流程

一、Spring AOP基础概念 1、基础概念 连接点(Join point)&#xff1a;能够被拦截的地方&#xff0c;Spring AOP 是基于动态代理的&#xff0c;所以是方法拦截的&#xff0c;每个成员方法都可以称之为连接点&#xff1b;切点(Poincut)&#xff1a;每个方法都可以称之为连接点&…...

定义现代化实时数据仓库,SelectDB 全新产品形态全面发布

导读&#xff1a;9 月 25 日&#xff0c;2023 飞轮科技产品发布会在线上正式召开&#xff0c;本次产品发布会以 “新内核、新图景” 为主题&#xff0c;飞轮科技 CEO 马如悦全面解析了现代化数据仓库的演进趋势&#xff0c;宣布立足于多云之上的 SelectDB Cloud 云服务全面开放…...

Linux系统编程(七):线程同步

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 同步概念 所谓同步&#xff0c;即同时起步、协调一致。不同的对象&#xff0c;对 “同步” 的理解方式略有不同 设备同步&#xff0c;是指在两个设备之间规定一个共同的时间参考数据库同步&#xff0c;是指让…...

文化传媒有限公司网站建设/自己建网页

这个实现起来很简单&#xff0c;就两步&#xff0c;先读取excel文件单元格的值&#xff0c;然后插入SQL数据库中。下面我介绍一下如何从excel文件读取数据&#xff0c;并插入到mysql数据库中&#xff0c;主要用到openpyxl和pymysql这两个包&#xff0c;实验环境win7 python3.6 …...

临朐网站建设定制/首页关键词排名

modal弹出框遮罩层可实现提示信息、验证码等功能 然而在官方文档已经删除了modal的页面&#xff0c;说要废弃modal 就个人而言modal组件无法被wx.showModal完全替代。大家都知道小程序的wxml的组件可以通过改变js的值实现重新渲染&#xff0c;而接口是无法实现的 有同感…...

建设部网站 造价/百度有效点击软件

使用SQL操作日期的几个方法:表示当天开始时间&#xff1a; CONVERT(datetime, CONVERT(char(10), getdate(), 120))表示当天12:00点&#xff1a;CONVERT(datetime, CONVERT(char(11), getdate(), 120)12:00:00.000)表示当周开始时间(星期日开始)&#xff1a;DATEADD(Day, 1, DA…...

网站开发实习生/自动点击器软件

root为#&#xff0c;普通用户用$常用指令ls   显示文件或目录-l 列出文件详细信息l(list)---ls -l-a 列出当前目录下所有文件及目录&#xff0c;包括隐藏的a(all)mkdir 创建目录-p 创建目录&#xff0c;若无父目录&#xff0c…...

山东省山东省建设厅网站/网页设计与制作案例教程

你如何读懂路由表, 你能读懂路由表吗&#xff1f;不懂&#xff1f;进来看看吧&#xff01;当前的路由&#xff1a; destination 目的网段 mask 子网掩码 interface 到达该目的地的本路由器的出口ip gateway 下一跳路由器入口的ip&#xff0c;路由器通过interface和gateway定义一…...

合肥网站建设方案/2022最新热点事件及点评

一.有两个列表 l1 [11,22,33] l2 [22,33,44] a. 获取内容相同的元素列表 for item in l1:if item in l2:print(item) View Codeb.获取l1中 有&#xff0c;l2中没有的元素列表 for item in l1:if item not in l2:print(item) View Codec.获取l2 中有&#xff0c;l1中没有…...