【C++干货铺】C++11常用新特性 | 列表初始化 | STL中的变化

news2024/11/16 13:52:35

=========================================================================

个人主页点击直达:小白不是程序媛

C++系列专栏:C++干货铺

代码仓库:Gitee

=========================================================================

目录

C++11简介

列表初始化

std::initializer_list

std::initializer_list使用场景

decltype关键字

STL中的一些变化

新容器

array

forward_list

容器中的一些新方法


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

struct Point
{
    int _x;
    int _y;
};
int main()
{
    int array1[] = { 1, 2, 3, 4, 5 };
    int array2[5] = { 0 };
    Point p = { 1, 2 };
    return 0;
}

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

int main()
{

	int i = 0;
	int j = { 1 };
	int k{ -1 };
	cout << i << " " << j << " " << k;

	int arr1[] = { 1,2,3,4,5 };
	int arr2[5] = { 0 };
	int arr3[]{ 1,2,3,4,5 };

	//添加到new表达式中
	int* pa = new int[4] {1, 2, 3, 4};

	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{ 2024,1,18 };
	//初始化一个对象,拷贝构造
    Date d2 = { 2024,1,19 };
	
	return 0;
}

注:这里的列表初始化的是直接调用构造函数,而下面的赋值重载看起来和列表初始化差不多,其实两者天差地别;赋值重载是先使用右边的数据构造生成一个临时对象,在赋值重载,而初始化列表是直接调用构造函数。存在类型转化。

std::initializer_list

std::initializer_list文档介绍

功能:可以接受任意多个相同类型的参数

std::initializer_list使用场景

  • std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
  • std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
  • 总结:我们使用初始化列表初始化STL中的容器时,就会将列表生成initializer_list;然后initializer_list作为容器构造函数的参数进行初始化。

decltype关键字

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

和typeid().name()、auto有很大的区别,typeid().name()推演出变量的类型,decltype是将变量的类型转化为字符串可以打印出来。

int main()
{
	int i;
	double j;
	vector<decltype(i* j)> v1;
	decltype(i * j) z = 10;
	cout << typeid(z).name() << endl;
	cout << z << endl;
	return 0;
}

 


STL中的一些变化

新容器

下面中圈起来的就是C++11中添加的新容器,最后的unordered_map和unordered_set不同于使用红黑树的map和set是使用hash结构实现;有关hash的内容和知识会在后面的文章中给大家介绍。

array

  • array数组是固定大小的序列容器:它们包含特定数量的元素,这些元素以严格的线性顺序排序。
  • 说白了也是一个数组,只不过和普通的数组比较其越界检查比较严格。

forward_list

是一个单链表,和list的区别在于只支持单向迭代器;并且只支持头插和头删。

容器中的一些新方法

  • 如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。
  • 比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的。
  • 容器中一些还有一些关于移动构造移动和移动赋值的一些内容需要有右值引用的知识铺垫,我会在下一篇文章中完整的给大家介绍。

今天给大家分享介绍了C++中常用特性的一部分,由于篇幅问题会在下篇文章中介绍右值引用等其他问题;如果觉得文章还不错的话,可以三连支持一下,个人主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是我前进的动力! 

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

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

相关文章

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

ChatGPT提示词保姆级教程

现在越来越多提示词教程&#xff0c;本文列个清单&#xff0c;方便以后整理&#xff0c;不定期更新&#xff0c;欢迎关注留言&#xff01; 后续更新欢迎关注 提示词&#xff08;prompt&#xff09;出来后&#xff0c;被称为一个新的岗位诞生&#xff0c;面向提示词工程师。 …

将vue项目打包成桌面客户端实现点击桌面图标直接进入项目

1.下载NW.js 下载地址&#xff1a;NW.js官网 下载完后zip解压 2.文件夹下新建index.html index内容如下&#xff1a; <!DOCTYPE html> <html> <head> </head> <body> <script language"javascript" type"text/javascript&q…

《游戏-01_2D-开发》

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…

K8s知识点总结_part1

Kubernetes 是什么 为用户提供一个具有普遍意义的容器编排工具。 它着重解决的问题是&#xff1a;大规模集群中的各种运行任务之间的关系处理&#xff0c;这些关系的处理&#xff0c;是作业编排和管理系统最困难的地方。 其能力有&#xff1a; • 基于容器的应用部署、维护和…

C#编程-使用反射检索元数据

使用反射检索元数据 术语反射通常用来指镜像。如果您站在镜子面前,镜子会反射出您的所有物理属性,如:您的身高、肤色和身体结构。在C#中也一样,反射被用于反射程序有关的所有信息。C#程序可以利用反射获得类在运行时的信息。 反射在运行时获取类型信息的过程中被使用。提…

Python自动化报告的输出用例详解

1、设计简单的用例 2、设计用例 以TestBaiduLinks.py命名 # coding:utf-8from selenium import webdriverimport unittestclass BaiduLinks(unittest.TestCase):def setUp(self):base_url https://www.baidu.comself.driver webdriver.Chrome()self.driver.implicitly_wait(…

监控系统——Zabbix

目录 Zabbix概述 Zabbix 监控原理 Zabbix 与 Prometheus的区别 Zabbix 6.0 新特性 Zabbix 6.0 功能组件 Zabbix Server 数据库 Web 界面 Zabbix Agent Zabbix Proxy Java Gateway Zabbix 6.0 部署 部署 zabbix 服务端 添加 zabbix 客户端主机 自定义监控内容…

如何使用idm下载百度网盘的资源

IDM是海内外都非常受欢迎的一款下载管理软件。它支持视频媒体嗅探和多线程下载&#xff0c;能够完美替代谷歌Chrome浏览器、Edge浏览器等浏览器的原生下载功能。在浏览器中单击下载链接时&#xff0c;idm将接管浏览器的原生下载工具并加快下载速度&#xff0c;支持HTTP&#xf…

Architecture Lab:part A 【实现sum_list/rsum_list/copy_block/熟悉Y86-64指令】

Architecture Lab 对应CS:APP的Chap 4——处理器体系结构。Part A要实现三个函数&#xff0c;分别为sum_list/rsum_list/copy_block。建议先得到x86-64指令&#xff0c;然后再转换为Y86-64指令。 准备工作 在misc目录下&#xff0c;键入以下命令用来生成汇编代码。命令执行完…

tui.calender日历创建、删除、编辑事件、自定义样式

全是坑&#x1f573;&#xff01;全是坑&#x1f573;&#xff01;全是坑&#x1f573;&#xff01;能不用就不用&#xff01; 官方文档&#xff1a;https://github.com/nhn/tui.calendar/blob/main/docs/en/apis/calendar.md 实例的一些方法&#xff0c;比如创建、删除、修改、…

【React】脚手架创建项目

文章目录 创建React项目目录结构分析了解PWA脚手架中的webpack 创建React项目 ◼ 创建React项目的命令如下&#xff1a; ​  注意&#xff1a;项目名称不能包含大写字母 ​  另外还有更多创建项目的方式&#xff0c;可以参考GitHub的readme 命令&#xff1a; create-rea…

Redis相关命令详解及其原理

Redis概念 Redis&#xff0c;英文全称是remote dictionary service&#xff0c;也就是远程字典服务。这是kv存储数据库。Redis&#xff0c;包括所有的数据库&#xff0c;都是请求-回应模式&#xff0c;通俗来说就是数据库不会主动地要给前台推送数据&#xff0c;只有前台发送了…

1026 程序运行时间 (15)

要获得一个 C 语言程序的运行时间&#xff0c;常用的方法是调用头文件 time.h&#xff0c;其中提供了 clock() 函数&#xff0c;可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick&#xff0c;即“时钟打点”。同时还有一个常数 CLK_TCK&…

使用zabbix-proxy进行分布式监控

目录 一、准备4台服务器 二、配置主从复制 1.准备环境 2.主机名解析 3.安装数据库 4.配置主库db1 5.配置从库db2 6.主从状态显示 三、db1&#xff0c;db2配置zabbix-agent 三、zabbix-server的配置 四、zabbix-proxy的配置 1.为您的平台安装和配置Zabbix-proxy a. …

勒索病毒:原理与防御

一、勒索病毒概述 勒索病毒&#xff0c;又称为Ransomware&#xff0c;是一种恶意软件&#xff0c;通过感染电脑系统、服务器或者手机等设备&#xff0c;使用户文件被加密&#xff0c;从而向用户索取赎金以解锁文件。近年来&#xff0c;勒索病毒已经成为网络安全领域的一大公害…

linux java 8安装

tar -zxf jdk-8u***.tar.gz -C /usr/loacl/ vim /etc/profile i 输入 export JAVA_HOME/usr/local/安装文件名 export PATH${JAVA_HOME}/bin:$PATH ESC :wq 保存退出 source /etc/profile 验证 java -version

【漏洞复现】上海真兰燃气收费系统信息泄露漏洞

Nx01 产品简介 上海真兰仪表科技股份有限公司&#xff0c;成立于2011年&#xff0c;真诺测量仪表成员&#xff0c;位于上海市&#xff0c;是一家以从事仪器仪表制造业为主的企业。 Nx02 漏洞描述 上海真兰仪表科技股份有限公司燃气收费系统存在信息泄露漏洞&#xff0c;log目录…

上海智慧岛大数据云计算中心项目正式封顶!

上海智慧岛大数据云计算中心封顶仪式现场 1月15日&#xff0c;云端股份在上海智慧岛大数据云计算中心举行封顶仪式。云之端网络&#xff08;江苏&#xff09;股份有限公司&#xff08;以下称“云端股份”&#xff09;总经理贡伟力先生&#xff0c;常务副总张靖先生等公司成员&…

BGP最通俗易懂的讲解——路由反射器

路由反射器 点赞关注&#xff0c;持续更新 路由反射器RR (Route Reflector&#xff09; : 允许把从IBGP 对等体学到的路由反射到其他BGP对等体的BGP设备。客户机 (Client) : 与RR形成反射邻居关系的IBGP设备。在AS内部客户机只需要与RR建立邻居关系。非客户机 (Non-Client) …