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

news2024/11/20 8:28:18

文章目录

  • 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.coloradmin.cn/o/1000838.html

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

相关文章

Kotlin面向对象基础使用方法(继承、接口、Lambda、空指针检查机制等)

三、面向对象 1、继承 1.1 open改变类的继承属性 在kotlin设计时默认所有的非抽象类是无法被继承的&#xff0c;如果想要使得一个非抽象类可以被继承&#xff0c;我们需要使用open关键字。 open class Person {var name "";var age 0;fun eat() {println(name …

入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析(5)

入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析&#xff08;5&#xff09;&#xff09; 入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析介绍自然语言处理的挑战NLP的基本任务NLP的基本技术NLP的应用领域 使用 P…

RHCSA Linux环境搭建

目录 一、安装Linux操作系统 二、创建虚拟机 1、成功激活后&#xff0c;开始“创建新的虚拟机” 新建虚拟机 2、自定义--根据我们的需求来创建 3、默认即可 4、选择稍后安装操作系统&#xff08;可自定义设置某些选项&#xff09; 5、选择Linux操作系统&#xff0c;版本…

Linux dup dup2函数

/*#include <unistd.h>int dup2(int oldfd, int newfd);作用&#xff1a;重定向文件描述符oldfd 指向 a.txt, newfd 指向b.txt,调用函数之后&#xff0c;newfd和b.txt close&#xff0c;newfd指向a.txtoldfd必须是一个有效的文件描述符 */ #include <unistd.h> #i…

Fourier傅里叶变换的线性性质和位移性质

Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1​(…

2023/9/11 -- C++/QT

作业 仿照string类&#xff0c;完成myString 类 02mystring.h: #ifndef __02MYSTRING_H__ #define __02MYSTRING_H__#include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public://无参构造myString();//有…

C++算法 —— 动态规划(5) 子序列

文章目录 1、动规思路简介2、最长递增子序列3、摆动序列4、最长递增子序列的个数5、最长数对链6、最长定差子序列7、最长斐波那契子序列的长度8、最长等差数列9、等差数列划分 II 每一种算法都最好看完第一篇再去找要看的博客&#xff0c;因为这样会帮你梳理好思路&#xff0c;…

Python 图形化界面基础篇:添加标签( Label )到 Tkinter 窗口

Python 图形化界面基础篇&#xff1a;添加标签&#xff08; Label &#xff09;到 Tkinter 窗口 引言什么是 Tkinter 标签&#xff08; Label &#xff09;&#xff1f;步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建标签&#x…

kafka管理工具之kafka-ui的环境搭建笔记

由于项目需要kafka支持认证功能&#xff0c;就把kafka升级到3.2.0了。之前一直使用的kafka tools(现在叫Offset Explorer&#xff0c;个人使用免费&#xff0c;商用付费)&#xff0c;开了认证之后就不好用了&#xff0c;卡的很&#xff0c;一点也不丝滑了&#xff0c;于是只好重…

pytorch代码实现之Partial Convolution (PConv卷积)

Partial Convolution (PConv卷积) Partial Convolution (PConv卷积)&#xff0c;有助于提升模型对小目标检测的性能。目前许多研究都集中在减少浮点运算&#xff08;FLOPs&#xff09;的数量上。然而FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运…

浅析建筑电气火灾问题和预防方案

安科瑞 华楠 摘要&#xff1a;近几年来随着技术化和信息化的不断发展&#xff0c;电器在建筑中的应用也是越来越广泛&#xff0c;电气也成为人们生活当中的一部分。现如今建筑物设计中都要增加电气线路的设计&#xff0c;几年电气引起的火灾也不在少数。建筑电气在运行的过程中…

OpenCV(三十七):拟合直线、三角形和圆形

1.点集拟合的含义 点集拟合是一种通过拟合函数或曲线来近似描述给定离散数据点的技术,在点集拟合中&#xff0c;可以使用不同的函数或曲线拟合方法来拟合直线、三角形和圆形。 直线拟合&#xff1a;对于给定的二维数据点集合&#xff0c;可以使用最小二乘法来拟合一条直线。 …

springboot之三:原理分析之自动配置condition

导入&#xff1a; SpringBoot是如何知道要创建哪个Bean的&#xff1f;比如Spring Boot是如何知道要创建RedisTemplate的&#xff1f; Condition&#xff1a; Condition是在Spring4.0增加的条件判断功能&#xff0c;通过这个可以实现选择性的创建Bean操作。 自定义条件&…

C++之string::npos应用实例(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用IDEA创建Vue3通过Vite实现工程化

1、创建Vite项目的分步说明 IntelliJ IDEA与Vite构建工具集成&#xff0c;改善了前端开发体验。Vite 由一个开发服务器和一个构建命令组成。构建服务器通过本机 ES 模块提供源文件。生成命令将代码与汇总捆绑在一起&#xff0c;汇总预配置为输出高度优化的静态资产以供生产。In…

AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式

大家好&#xff0c;本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗&#xff1f;下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS&#xff0c;你就可以得到一套自己的专属表情包啦~ 整体制作…

Go 基础15-在init()函数中检查包级变量的初始状态

从程序逻辑结构角度来看&#xff0c;包&#xff08;package&#xff09;是Go程序逻辑封装的基本单元&#xff0c;每个包都可以理解为一个“自治”的、封装良好的、对外部暴露有限接口的基本单元。一个Go程序就是由一组包组成的。 在Go包这一基本单元中分布着常量、包级变量、函…

胡焕庸线,我国东西地级市分布密度分界线

背景 黑河—腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图&#xff0c;并与胡焕庸线一起展示时&#xff0c;惊奇的发现&#xff0c;胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…

【17 > 分布式接口幂等性】2. Update的幂等性原理解析

一、 根据 唯一业务号去更新 数据的情况 1.1 原理 1.2 操作 1.3 实战 Stage 1&#xff1a;表添加 version 字段 Stage 2&#xff1a;前端 > 版本号放入隐藏域 Stage 3&#xff1a;后台 > 使用版本号作为更新条件 二、更新操作没有唯一业务号&#xff0c;可使用Tok…

FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程

FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。…