【C++11】新特性
前言:
C++11
是C++
编程语言的一个重要版本,于2011
年发布。它带来了数量可观的变化,包含约140
个新特性,以及对C++03
标准中约600
个缺陷的修正,更像是从C++98/03
中孕育出的新语言
列表初始化
C++11
中的列表初始化(List Initialization)
是一种新的初始化语法,它提供了更统一、更灵活和更安全的初始化方式。以下是关于 C++11 列表初始化的详细介绍
基本语法
可以直接在变量名后面加上初始化列表来进行对象的初始化。
int x = {10}; // 初始化一个整数变量 x 为 10
int arr[] = {1, 2, 3}; // 初始化一个整数数组 arr
std::vector<int> v = {4, 5, 6}; // 初始化一个 std::vector 容器
适用范围
- **内置类型:**可用于所有内置类型,如整数、浮点数、字符等。
- **自定义类型:**对于自定义的类或结构体,如果满足聚合类型的条件,也可以使用列表初始化。如果类定义了合适的构造函数(包括接受 std::initializer_list 类型参数的构造函数),同样可以使用列表初始化
聚合类型的条件
在 C++11 中,聚合类型需要满足以下条件1:
- 类型是一个普通数组:如
int[5]
,char[]
,double[3]
等。 - 类型是一个类,且满足以下条件:
- 没有用户声明的构造函数。
- 没有用户提供的构造函数(允许显示预置或弃置的构造函数)。
- 没有私有或保护的非静态数据成员。
- 没有基类。
- 没有虚函数。
- 没有
{}
和=
直接初始化的非静态数据成员。 - 没有默认成员初始化器
initializer_list
initializer_list
是 C++11
引入的一种模板类,用于表示某种类型的对象的列表。它提供了一种方便的方式来处理和传递一组相同类型的值,类似于其他语言中的列表或数组。以下是关于 initializer_list
的一些重要特点和用法:
-
创建和初始化:
- 可以使用花括号
{}
来创建一个std::initializer_list
对象,并在其中列出要包含的元素。例如:std::initializer_list<int> myList = {1, 2, 3, 4, 5};
。 - 元素的类型必须相同,否则会导致编译错误。不过,编译器会进行一些隐式的类型转换,例如将
int
类型的元素转换为double
类型的列表是允许的,但可能会有精度损失。例如:std::initializer_list<double> doubleList = {1, 2, 3};
这里1
、2
、3
会被隐式转换为1.0
、2.0
、3.0
。 - 不允许进行缩窄转换,即会导致数据丢失或精度降低的转换是不被允许的。例如:
std::initializer_list<char> charList = {1000};
会导致编译错误,因为1000
超出了char
类型的取值范围。
- 可以使用花括号
-
常见用法:
- 初始化容器:可以方便地用于初始化标准库中的容器,如
std::vector
、std::list
等。例如:std::vector<int> vec = {1, 2, 3};
。 - 函数参数:函数可以接受
std::initializer_list
作为参数,从而可以接收任意数量的同类型参数。例如:
void printValues(std::initializer_list<int> values) {for (auto value : values) {std::cout << value << " ";}std::cout << std::endl; }int main() {printValues({1, 2, 3, 4, 5});return 0; }
- 类的构造函数:在类的构造函数中使用 std::initializer_list,可以方便地实现多种初始化方式。例如:
- 初始化容器:可以方便地用于初始化标准库中的容器,如
auto
在 C++11
中,auto
是一个用于自动类型推导的关键字。它可以让编译器根据初始化表达式的类型自动推断变量的类型,从而简化代码的编写,提高代码的可读性和可维护性1。以下是关于 auto 的一些重要特点和用法:
- 基本用法:在定义变量时,使用
auto
关键字,编译器会根据初始化的值来推断变量的类型。例如:
auto x = 5; // x 的类型为 int
auto y = 3.14; // y 的类型为 double
auto z = "hello, world!"; // z 的类型为 const char*
与指针和引用结合:
auto
可以与指针结合使用,用于自动推导指针类型。例如:
int num = 10;
auto ptr = # // ptr 的类型为 int*
- 用于函数返回值类型推导(C++14):在 C++14 标准中,可以使用
auto
关键字结合->
运算符来推导函数的返回值类型。例如:
auto add(int a, int b) -> int {return a + b; // 返回 a 和 b 的和
}
- 在范围
for
循环中的应用(C++11):C++11 引入的范围for
循环结合auto
关键字,可以更方便地遍历容器。例如:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto number : numbers) {std::cout << number << std::endl; // 输出每个元素
}
优点
- 简化代码:避免了手动指定复杂的类型,尤其是对于模板库中复杂的迭代器类型等,使用
auto
可以大大简化代码的书写1。 - 提高可读性:使代码更加清晰易读,减少了类型声明带来的视觉干扰,让开发者更关注于代码的逻辑而不是类型的细节1。
- 灵活性:在类型需要改变时,只需要修改初始化表达式的类型,而使用
auto
定义的变量的类型会自动随之改变,减少了代码修改的工作量。
decltype
基本语法
decltype(expression) variable_name;
expression
:用于推导类型的表达式。variable_name
:根据推导出的类型声明的变量名。
使用场景
-
推导变量的类型
通过decltype
,你可以推导一个已有变量的类型:int a = 5; decltype(a) b = 10; // b的类型是int,和a相同
-
推导表达式的类型
decltype
也可以用于推导更复杂的表达式的类型:int x = 10; decltype(x + 1.0) y; // y的类型是double,因为x+1.0的结果是double
-
用于函数返回类型
在C++11中,你可以通过decltype
根据函数内部表达式来指定返回类型:template<typename T1, typename T2> auto add(T1 a, T2 b) -> decltype(a + b) {return a + b; }
这里,
decltype(a + b)
将推导出a + b
的类型,并用作返回类型。 -
在lambda表达式中使用
在C++11中,你可以在lambda表达式中使用decltype
推导捕获变量或返回值的类型:auto lambda = [](int x, int y) -> decltype(x + y) {return x + y; };
decltype与auto的区别
auto
用于根据初始化表达式推导变量类型。decltype
不需要初始化,直接根据表达式推导类型,可以用于声明变量、函数返回类型等。
例如:
int a = 5;
auto b = a; // auto推导b为int
decltype(a) c; // decltype推导c为int,但c未初始化
用于根据初始化表达式推导变量类型。
decltype
不需要初始化,直接根据表达式推导类型,可以用于声明变量、函数返回类型等。
例如:
int a = 5;
auto b = a; // auto推导b为int
decltype(a) c; // decltype推导c为int,但c未初始化
decltype
可以在编译时推导任意表达式的类型,因此在模板和泛型编程中,decltype
是一个强大的工具。
相关文章:

【C++11】新特性
前言: C11 是C编程语言的一个重要版本,于2011年发布。它带来了数量可观的变化,包含约 140 个新特性,以及对 C03 标准中约600个缺陷的修正,更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化࿰…...

【游戏模组】重返德军总部2009高清重置MOD,建模和材质全部重置,并且支持光追效果,游戏画质大提升
各位好,今天小编给大家带来一款新的高清重置MOD,本次高清重置的游戏叫《重返德军总部2009》2009年发布,我相信很多玩家已经玩过了,如果你还没有玩过我也可以和你简单介绍一下剧情,这款游戏故事背景接续在《重返德军总部…...

CGLib动态代理和JDK动态代理Demo、ASM技术尝鲜
本文主要介绍CGLib和JDK动态代理的使用,不对源码进行深入分析。代码可直接复制使用。 类型 机制 回调方式 适用场景 效率 JDK动态代理 委托机制。代理类和目标类都实现了同样的接口。InvocationHandler持有目标类。代理类委托InvocationHandler去调用目标类原…...

[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型
【算法介绍】 使用纯OpenCV部署YOLOv11-Pose姿态估计ONNX模型是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…...
python you-get下载视频
You-Get是一个使用Python开发的命令行工具,用于下载网络上的音视频资源。你可以通过pip安装You-Get,具体操作如下: 打开命令行工具,输入pip install you-get,然后回车执行命令 You-Get还允许你指定下载的视频格式和质…...

SCUC博客摘录「 储能参与电能市场联合出清:SCUC和SCED模型应用于辅助服务调频市场(IEEE39节点系统)」2024年10月6日
2.1 SCUC模型在本方法中,首先利用SCUC模型确定机组出力计划和储能充放电计划。SCUC模型是电力系统经济调度的重要工具,通过优化发电机组出力计划和调度,实现电力系统的经济性和可靠性。在考虑储能的情况下,SCUC模型需要考虑储能的…...

Git分支-团队协作以及GitHub操作
Git分支操作 在版本控制过程中,同时推进多个任务> 程序员开发与开发主线并行,互不影响 分支底层也是指针的引用 hot-fix:相当于若在进行分支合并后程序出现了bug和卡顿等现象,通过热补丁来进行程序的更新,确保程序正常运行 常…...

力扣刷题 | 两数之和
目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 给定一个整数数组 nums 和…...

[C#]winform部署官方yolov11-obb旋转框检测的onnx模型
【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov11-obb(You Only Look Once version 8 with Oriented Bounding Boxes)是一种先进的对象检测算法,它在传统的Yolov3和Yolov4基础上进行了优化,加…...

【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析
1 缘起 充电、充电、充电。 增加一些必备的知识,帮助后续使用。 2 配置JVM参数 为分析GC日志以及OOM相关信息,配置JVM参数,分为三个部分: (1)堆内存,包括年轻代、最大堆内存; &a…...

【电路】1.1 实际电路和电路模型
1.1 实际电路和电路模型 科学理论的研究对象是现实世界背后的抽象世界,如: 数学中的 ∞ \infty ∞,经典力学中“质点”的概念,牛顿运动定律(如惯性定律,如果一个物体不受外力情况下,一直保持匀…...

Vue - 打包部署
vscode找到NPM脚本,点击build。 目录下出现dist目录则表示安装成功。 安装Nginxnginx: download 目录用途conf配置文件目录html静态资源文件目录logs日志文件目录temp临时文件目录 将刚刚打包好的文件放到html目录下。 点击nginx.exe,用localhost:默认…...

spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
文章目录 【README】【1】文件上传与MultipartResolver【1.1】使用MultipartResolver进行文件上传【1.2】springmvc处理multipart多部件请求流程【1.3】使用springmvc上传文件代码实现(springmvc6.10版本): 【2】Handler与HandlerAdaptor&…...
springboot项目中属性的使用优先级;maven编译插件切换环境变量
概述 在项目部署时,相关的生产环境和测试环境是分开的,但是代码是同一套; 所以一般会有多套变量; 项目中默认变量(一般是测试环境) 线上变量(线上数据较敏感,一般也不会放在代码中&…...

【Qt】控件概述 (1)—— Widget属性
控件概述 1. QWidget核心属性1.1核心属性概述1.2 enable1.3 geometry——窗口坐标1.4 window frame的影响1.4 windowTitle——窗口标题1.5 windowIcon——窗口图标1.6 windowOpacity——透明度设置1.7 cursor——光标设置1.8 font——字体设置1.9 toolTip——鼠标悬停提示设置1…...

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践
学员闯关手册:https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频:https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档: https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…...
OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 VideoCapture 中设置一个属性。 在OpenCV中,cv::VideoCapture::set() 函数用于设置视频捕获设备的属性。这些属性可以包括分辨率、…...

数据结构之树(3)
一、森林和树的转换 重要! 树->二叉树 由于孩子兄弟链式存储和二叉树链式存储本质相同,故树可转换为二叉树。 森林->二叉树 森林:m棵互不相交的树的集合 森林->树 树->二叉树 森林中各个树的根节点之间视为兄弟关系 二、树…...

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)
2 前期工作 2.1 切换yum源并更新 删除/etc/yum.repos.d/原有repo文件,将Centos-7.repo库文件拷贝到该目录下。 然后清楚原有缓存yum clean all 生成新的缓存yum makecache 更新yum update –y 然后再确认/etc/yum.repos.d/不会有其他库文件,只留下…...

强化学习笔记之【Q-learning算法和DQN算法】
强化学习笔记(一)——Q-learning和DQN算法核心公式 文章目录 强化学习笔记(一)——Q-learning和DQN算法核心公式前言:Q-learning算法DQN算法 前言: 强化学习领域,繁冗复杂的大段代码里面&#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...