【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

文章目录

  • 1. C++11简介
  • 2. 统一的列表初始化
    • 2.1 {}初始化
    • 2.2 std::initializer_list
  • 3. 声明
    • 3.1 auto
    • 3.2 decltype
  • 4. nullptr
  • 5. 范围for循环
  • 6. 智能指针
  • 7. C++11STL中的一些变化
  • 8. 演示代码

1. C++11简介

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98称为C++11之前的最新C++标准名称。
不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。

从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟

相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。
相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛化和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。
在这里插入图片描述

C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以最近的几篇文章主要讲解实际中比较实用的语法

官方文档

小故事:

1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。
结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。

2. 统一的列表初始化

首先声明一下:

这个列表初始化和我们类和对象那里学的初始化列表不是一个概念,是不同的。

2.1 {}初始化

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

在这里插入图片描述

那我们C语言里面其实就是这样搞的嘛,所以可以认为C++支持这样就是因为要兼容C嘛

那么在C++11中:

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

🆗,我们来演示一下:

在这里插入图片描述
大家看,C++11支持我们这样使用{}初始化,并且赋值=也可以省略

然后要注意:

在这里插入图片描述
这样写是咋回事?
🆗,这是不是可以认为是调int的默认构造啊,我们之前说过,有了模板之后,内置类型也需要有构造函数了。

然后:

C++11中列表初始化也可以适用于new表达式中
在这里插入图片描述

另外:

创建对象时也可以使用列表初始化方式调用构造函数初始化

比如我们之前写过的日期类:

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};

在这里插入图片描述

2.2 std::initializer_list

那除了上面的场景呢,C++11还支持了STL里面的容器也可以这样去初始化

比如:

在这里插入图片描述
🆗,都是可以的,其它容器也可以,大家可以自己试。

那大家思考一下,在容器这里它是如何支持可以这样写的呢?

首先我们来看一下这个:

在这里插入图片描述
这里我们直接给一个大括号,里面放一些元素,这是个啥啊。
之前我们初始化数组可以这样写嘛,那它在这里也是一个数组吗?
那数组怎么直接赋值给一个vector呢?
🆗,那不清楚的话我们可以打印看一下它的类型是什么:
在这里插入图片描述
大家看,它的类型是一个叫做initializer_list<int>的东西。

那为什么这个东西可以赋值给vector呢?

在这里插入图片描述
🆗,大家看红色圈出来的部分,C++11给STL中的这些容器增加了这样一个构造函数。
支持用initializer_list类型的对象去构造vector这些容器。
所以正常使用这个构造应该是这样写:
在这里插入图片描述
那我们写成这样
在这里插入图片描述
当然也可以,因为构造函数支持隐式类型转换嘛。

那initializer_list这个类是个啥呢?

在这里插入图片描述
initializer_list是C++11引入的一种特殊类型,用于简化初始化列表的使用。它可以在构造函数或函数参数中以列表的形式传递一组值。
可以认为它就是一个常量数组,存储在常量区,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。
在这里插入图片描述
这是它的一些接口

那我们接下来做一件事情:

我们之前不是模拟实现过STL里面的各种容器的,那以vector为例,我们来对它改造一下,让它也支持用initializer_list进行{}初始化和赋值。

怎么做呢?给它增加这个构造函数就行了

在这里插入图片描述
🆗,每增加之前我们自己的vector肯定是不行的,而且大家看这个报错,编译器自动就把后面的常量数组识别成initializer list类型了
我们来写一下:
在这里插入图片描述
这下我们再来运行
在这里插入图片描述
就可以了
然后再提一下就是
在这里插入图片描述
如果这里用迭代器遍历的话前面加一个typename,这个我们之前也提过,就是类模板里面直接取内嵌类型它会分不清是类型还是静态成员变量。

当然不止vector可以,我们说了C++11给STL这几个容器都增加了initializer_list版本的构造:

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

当然除了构造还支持了initializer_list版本的赋值重载:

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

3. 声明

c++11提供了多种简化声明的方式

3.1 auto

那auto呢我们在C++专栏第一篇文章C++入门的时候就介绍过了,所以这里就不再重复了

3.2 decltype

再来学一个C++11引入的关键字——decltype

什么作用呢?

decltype是可以获取表达式或变量类型的关键字
我们之前用过typeid(变量/表达式).name()可以获取变量或表达式的类型,然后我们可以打印出来查看,而使用decltype我们可以获取类型并使用这个类型

比如:

在这里插入图片描述

但是大家可能会说:

在这里插入图片描述
上面的场景用auto也是可以的啊。

确实,但是有的场景auto就不行,比如:

我们要定义一个vector,要求vector里面存储的数据类型跟表达式x*y的返回类型一致
在这里插入图片描述
大家看,这个场景auto就不行了吧

4. nullptr

这个我们之前也介绍过了

5. 范围for循环

也介绍过了

6. 智能指针

关于智能指针我们后面会单独作为一个章节来给大家讲解

7. C++11STL中的一些变化

下面我们来分析一下C++11中STL与之前相比有了那些变化

首先它增加了一些新容器:

在这里插入图片描述
用橘色圈起来是C++11中的一些几个新容器,我们也都介绍过了,但是实际最有用的是unordered_map和unordered_set,另外两个就显得非常鸡肋
在这里插入图片描述

其次呢就是增加了一些新方法:

比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。
实际上C++11更新后,容器中增加的新方法最实用的就是插入接口函数的右值引用版本
在这里插入图片描述
在这里插入图片描述

那关于这里3、4两点提到的右值引用和移动语义我们后面也会花大量篇幅给大家讲解…

8. 演示代码

把上面演示过的代码给大家:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;//struct Point
//{
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	int a(4);
//
//	int b = { 2 };
//	int c{ 3 };
//
//	int arr[]{ 1,2,3,4,5 };
//
//	Point p{ 1,2 };
//
//	// C++11中列表初始化也可以适用于new表达式中
//	int* pa = new int{ 5 };
//	cout << *pa << endl;
//	return 0;
//}//class Date
//{
//public:
//	Date(int year, int month, int day)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1(2022, 1, 1); // old style
//
//	// C++11支持的列表初始化,这里会调用构造函数初始化
//	Date d2 = { 2022, 1, 2 };
//	Date d3{ 2022, 1, 3 };
//	return 0;
//}#include <vector>
#include <list>
//int main()
//{
//	vector<int> v = { 1,2,3,4 };
//
//	vector<int> v2({ 1,2,3,4 });
//
//	list<int> lt = { 2,4,6,8,9 };
//
//	initializer_list<int> il = { 1,2,3,4,5,6,7,8 };
//
//	vector<int> v3 = il;
//
//	return 0;
//}int main()
{const int x = 1;double y = 2.2;//decltype(x * y) ret; // ret的类型是double//decltype(&x) p;		// p的类型是const int*auto ret = x * y;auto p = &x;vector<decltype(x* y)> v;cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows环境下node安装教程(超详细)

安装node.js 1、下载node: 下载地址&#xff1a;下载 | Node.js 中文网 node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路next就可以了 选择一中方式就可以 2、解压后的目录,或者mis安装后的目录如下: 3、安装完后&#xff0c;可以在命令行中输入…

vscode调试程序设置

主要设置和json内容如下&#xff1a; cpp_properties.json内容&#xff1a; {"configurations": [ //C intellisense插件需要这个文件&#xff0c;主要是用于函数变量等符号的只能解析{"name": "Win32","includePath": ["${work…

Windows云服务器 PHP搭建网站外网无法访问的问题

前言&#xff1a;本人在华为云上租了一台windows的云主机&#xff0c;可以远程访问桌面的那种&#xff0c;然后想搭个网站&#xff0c;最开始想到的是IIS&#xff0c;测试了下用html的文件&#xff0c;没有问题。但是&#xff0c;php文件却不能用&#xff0c;因为少了PHP环境。…

微信小程序中识别html标签的方法

rich-text组件 在微信小程序中有一个组件rich-text可以识别文本节点或是元素节点 具体入下: //需要识别的数据放在data中,然后放在nodes属性中即可 <rich-text nodes"{{data}}"></rich-text>详情可以参考官方文档:https://developers.weixin.qq.com/mi…

穷举深搜暴搜回溯剪枝(4)

一)单词搜索: 直接在矩阵中依次找到特定字符串 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 画出决策树&#xff0c;只需要做一个深度优先遍历: 1)设计dfs函数:只需要关心每一层在做什么即可&#xff0c;从这个节点开始&#xff0c;开始去尝试匹配字符串的下一个字符…

海光异构智能计算专区上线飞桨AI Studio!

近日&#xff0c;海光异构智能计算专区正式上线飞桨AI Studio(星河社区)。专区内容来自官方发布和社区贡献&#xff0c;包含双方产品合作成果、行业解决方案、优秀项目展示等&#xff0c;致力于帮助开发者快速了解体验飞桨、为海光异构智能计算软硬协同优化带来更高性能提升。 …

Kafka3.0.0版本——消费者(消费者组原理)

目录 一、消费者组原理1.1、消费者组概述1.2、消费者组图解示例1.3、消费者组注意事项 一、消费者组原理 1.1、消费者组概述 Consumer Group&#xff08;CG&#xff09;&#xff1a;消费者组&#xff0c;由多个consumer组成。形成一个消费者组的条件&#xff0c;是所有消费者…

C#事件event

事件模型的5个组成部分 事件拥有者&#xff08;event source&#xff09;&#xff08;类对象&#xff09;&#xff08;有些书将其称为事件发布者&#xff09; 事件成员&#xff08;event&#xff09;&#xff08;事件拥有者的成员&#xff09;&#xff08;事件成员就是事件本身…

用python实现基本数据结构【04/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

2023高教社杯数学建模A题思路分析 - 定日镜场的优化设计

# 1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

FastViT实战:使用FastViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam安装mmcv 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集补充一个知识点&#xff1a;torch.jit两种保存方式 摘要 论文翻译&#xff1a;https://wanghao.blog.csdn.net/article/details/132407722?spm1001.2014.3001.550…

mysql leetcode打题记录

文章目录 完成度基本语法高级语法连接日期 函数编写函数聚合函数 因为上过的数据库课实在太水了&#xff0c;所以打算先在菜鸟教程/CSDN/leetcode先学一下基本语法&#xff0c;然后去做Stanford数据库原理的课程CS145。 小目标&#xff1a;把leetcode上不用钱的mysql的题先做一…

企业密码安全:ADSelfService Plus 提升密码管理的千里之行

在当今数字化时代&#xff0c;企业的密码安全变得至关重要。密码是保护企业敏感信息和数据的第一道防线&#xff0c;而有效的密码管理对于确保网络安全至关重要。ADSelfService Plus是一款强大的密码管理和自助服务解决方案&#xff0c;它在提供密码安全方面走在了前沿。 ADSel…

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 &#xff08;1&#xff09;pull&#xff08;拉&#xff09;模式&#xff1a;消费者从broker中主动拉取数据。&#xff08;Kafka中使用&#xff09; 不足&#xff1a;如果Kafka中没有数据&#xff0c;消费者可能会陷入循环&#xff0c;一直返回空数据。 &#…

Python自动化测试(1)-自动化测试及基本技术手段概述

生产力概述 在如今以google为首的互联网时代&#xff0c;软件的开发和生产模式都已经发生了变化&#xff0c; 在《参与感》一书提到&#xff1a;某位从微软出来的工程师很困惑&#xff0c;微软在google还有facebook这些公司发展的时候&#xff0c;为何为感觉没法有效还击&…

嵌入式基础知识-信息安全与加密

本篇来介绍计算机领域的信息安全以及加密相关基础知识&#xff0c;这些在嵌入式软件开发中也同样会用到。 1 信息安全 1.1 信息安全的基本要素 保密性&#xff1a;确保信息不被泄露给未授权的实体。包括最小授权原则、防暴露、信息加密、物理加密。完整性&#xff1a;保证数…

电容笔值不值得买?开学季比较好用的电容笔

眼看着新学期即将到来&#xff0c;到底应该选择什么样的电容笔&#xff1f;一款原装的苹果Pencil&#xff0c;就卖到了将近一千块&#xff0c;这对于很多人来说&#xff0c;都是一个十分昂贵的价格。事实上&#xff0c;由于平替电容笔的价格非常便宜&#xff0c;只要一二百元就…

【Spring Boot 源码学习】OnClassCondition 详解

Spring Boot 源码学习系列 OnClassCondition 详解 引言往期内容主要内容1. getOutcomes 方法2. 多处理器拆分处理3. StandardOutcomesResolver 内部类4. getMatchOutcome 方法 总结 引言 上篇博文带大家从源码深入了自动配置过滤匹配父类 FilteringSpringBootCondition&#x…

尚硅谷大数据项目《在线教育之离线数仓》笔记007

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第12章 报表数据导出 P112 01、创建数据表 02、修改datax的jar包 03、ads_traffic_stats_by_source.json文件 P113 P114 P115 P116 P117 P118 P119 P120 P121 P122【122_在…

小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程

喜欢买小米手机&#xff0c;很多是因为小米手机的开放&#xff0c;支持root权限&#xff0c;而ROOT对普通用户来说更多的是刷入DIY模块功能&#xff0c;今天ROM乐园小编就教大家如何使用面具ROOT&#xff0c;实现大家日常情况下非常依赖的微X模块功能&#xff0c;体验微X模块的…