【C++】C++11-基础

news2025/5/25 8:40:08

目录

1、统一的列表初始化

1.1 {}初始化

1.2 std::initializer_list

2、声明

2.1 auto

2.2 decltype

2.3 nullptr

3、范围for

4、智能指针

5、STL中的一些变化

5.1 新容器

5.2 新方法


1、统一的列表初始化

1.1 {}初始化

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

struct Point
{
	int _x;
	int _y;
};
int main()
{
	Point pt = { 7,7 };
	int a1[] = { 1,2,3,4,5 };
	int a2[5] = { 0 };
	return 0;
}

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

class Date
{
public:
	Date(int year = 0,int month = 1,int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
struct Point
{
	int _x;
	int _y;
};
int main()
{
	// 一切均可用列表初始化
    // 三种写法一样
	int x1 = 7;
	int x2 = { 7 };
	int x3{ 7 };

	Point p1 = { 7,7 };
	Point p2{ 7,7 };

	Date d1(2024, 8, 12);
	Date d2 = { 2024,8,12 };
	Date d3{ 2024,8,12 };
	//Date& d4 = { 2024,8,12 }; // 这样是错的,需要加const
	return 0;
}

拿上面Date类型的对象来做解释,d1是直接调用构造函数,d2是用{2024,8,12}构造一个临时对象,然后用这个临时对象拷贝构造d2,但通常会被优化为直接构造,这也是d4之所以不行的原因,d3和d2是一样的

都是单参数/多参数的隐式类型转换

1.2 std::initializer_list

initializer_list称为初始化列表,与上面的列表初始化是不同的,initializer_list用于容器的初始化

int main()
{
	Date d1 = { 2024,8,12 };
	vector<int> v1 = { 1,2,3,4,5,6,7 };
	return 0;
}

像这里Date类的对象初始化时给的参数需要和构造函数的参数相同,因为是用所给的参数去调用构造函数创建一个临时对象,再用临时对象拷贝构造d1。在vector这里,是用给的参数先创建一个initializer_list对象,这个对象中只有两个指针,大小始终为8字节(32位),空间是开在栈上的,然后用这个对象中的值去构造出vbector

int main()
{
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	return 0;
}

这段代码中,里面的{}是创建pair,外面的{}是创建map

2、声明

c++11提供了多种简化声明的方式,尤其是在使用模板时

2.1 auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型

int main()
{
	int i = 7;
	auto j = i;
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	map<string, string>::iterator it1 = dict.begin();
	auto it2 = dict.begin();
	cout << typeid(i).name() << endl;
	cout << typeid(j).name() << endl;
	cout << typeid(it1).name() << endl;
	cout << typeid(it2).name() << endl;
	return 0;
}

2.2 decltype

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

int main()
{
	const int x = 1;
	double y = 2.2;
	decltype(x * y) ret; // ret的类型是double
	decltype(&x) p; // p的类型是int*
	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;
	return 0;
}

typeid推导出类型后只能打印,decltype推导出类型后还能定义对象。这好像和auto有点像,不过decltype可以用于一些auto不能使用的场景

int main()
{
	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
	auto it = dict.begin();
	// 创建一个存放迭代器的vector
	vector<decltype(it)> v;
	return 0;
}

2.3 nullptr

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

3、范围for

这个在之前已经介绍过了

4、智能指针

由于这个内容较多,后序会单独讲解

5、STL中的一些变化

5.1 新容器

圈出来的这几个是新增的STL容器

array是数组,其对越界访问的检查更加严格,operator[]是断言,at是抛异常。普通数组越界读是检查不出来的,越界写只能检测距离数组大小接近的部分,距离太多是检查不出来的

forward_list是单向链表

5.2 新方法

如果我们再细细去看会发现基本每个容器中都增加了一些C++11的方法,但是其实很多都是用得比较少的。比如提供了cbegin和cend方法返回const迭代器等等,但是实际意义不大,因为begin和end也是可以返回const迭代器的,这些都是属于锦上添花的操作。实际上C++11更新后,容器中增加的新方法最后用的插入接口函数的右值引用版本:

但是这些接口到底意义在哪?网上都说他们能提高效率,他们是如何提高效率的?

请看下面的右值引用和移动语义的讲解。另外emplace还涉及模板的可变参数,也需要再继续深入学习后面章节的知识。

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

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

相关文章

光伏发电量如何计算?

真实光伏发电情况&#xff0c;需要根据几十种复杂因素&#xff0c;再通过鹧鸪云算法&#xff0c;快速计算出实际发电量情况。 1、自研算法&#xff0c;技术创新引领未来 鹧鸪云光伏发电量自研算法&#xff0c;是研发团队历经8个月&#xff0c;基于深度学习、大数据分析等前沿技…

Aqara澳门体验店开业 品牌实力与市场前景备受瞩目

在全球经济持续波动的背景下&#xff0c;许多品牌选择采取保守策略。然而&#xff0c;Aqara却还能稳步前行&#xff0c;展现出了强劲的发展势头。7月20日&#xff0c;Aqara在澳门市场迈出了重要一步&#xff0c;开设了该地区首家标准4S智能家居体验馆。这一战略性的布局不仅凸显…

跟《经济学人》学英文:2024年09月07日这期 Can IKEA disrupt the furniture business again?

Can IKEA disrupt the furniture business again? It wants to help you sell your Billy bookcase disrupt&#xff1a; 颠覆&#xff0c;彻底改变 这里的 “disrupt” 是指“颠覆”或“彻底改变”某个行业或市场的现有运作方式&#xff0c;通常通过引入创新的做法或技术来…

Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警

1 Django中集成celery # Django --->python 的web框架-web项目--》用浏览器访问 # celery--->分布式异步任务框架-定时任务-延迟任务-异步任务1.1 安装模块 #官方文档&#xff1a;https://docs.celeryq.dev/en/stable/django/first-steps-with-django.htmlpip install …

JavaEE:文件内容操作(二)

文章目录 文件内容操作读文件(字节流)read介绍read() 使用read(byte[] b) 使用 read(byte[] b, int off, int len) 使用 写文件(字节流)write介绍write(int b) 使用write(byte[] b) 使用write(byte[] b, int off, int len) 使用 读文件(字符流)read() 使用read(char[] cbuf) 使…

[产品管理-6]:NPDP新产品开发 - 4 - 战略 - 创新支持战略,支持组织的总体创新战略(平台战略、技术战略、营销战略、知识产权战略、能力建设战略)

目录 一、创新支持战略概述 二、平台战略&#xff1a;大平台小产品战略 2.1 概述 1、平台战略的定义 2、平台战略的特点 3、平台战略的应用领域 4、平台战略的成功案例 5、平台战略的发展趋势 2.2 大平台小产品战略 1&#xff09;大平台的建设 2&#xff09;、小产品…

day-53 两个线段获得的最多奖品

思路 dp[right] 表示右端点不超过 prizePositions[right] 的线段可以覆盖最大奖品数量&#xff0c;然后枚举后面一条线段的右端点&#xff08;第一条线段在第二条线段左边&#xff09;&#xff0c;第二条线段的长度可以表示为right-left1;第一条线段的长度可以表示dp[left] 解…

MINICPM-V2_6图像得到embedding-代码解读

目的 基于上一篇MINICPM-V2_6图像预处理流程-代码解读将输入图片得到了input_ids、attention_mask、pixel_values、image_sizes、image_bound、tgt_sizes&#xff0c;但是要怎么通过这些得到图片对应的embedding呢&#xff1f; 这里接着从MINICPM-V2_6入手&#xff0c;了解如何…

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作

在 Windows 系统上&#xff0c;文件传输到虚拟机&#xff08;VM&#xff09;可以通过 VS Code 的图形界面&#xff08;GUI&#xff09;或命令行工具进行操作。以下是几种方法&#xff1a; ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**&#xff1a; - 在 VS Cod…

eNUM 原理概述(VoNR VoLTE适用) eNUM 报文解析

目录 1. eNUM 原理概述(VoNR VoLTE适用) 1.1 主要内容 1.2 什么是 eNUM 及 FAQ 1.3 eNUM 的主要信令场景 1.4 eNUM 查询结果为空&#xff0c;意味着什么&#xff1f; 1.5 eNUM 典型流程举例(VoNR 呼叫流程) 1.6 案例&#xff1a;因 eNUM 配置错误导致呼叫失败&#xff…

【STM32】BH1750光敏传感

1.BH1750介绍 BH1750是一个光敏传感&#xff0c;采用I2C协议&#xff0c;对于I2C的从机&#xff0c;都有自己的地址&#xff0c;用来主机选择和哪个从机通信&#xff0c;对于OLED来说&#xff0c;只有单片机通过I2C往OLED中写数据。而BH1750来说&#xff0c;有单片机往BH1750写…

illusionX——一个从理解情感到改变学习、创新教育体验集成情感计算的混合现实系统

概述 论文地址&#xff1a;https://arxiv.org/pdf/2402.07924.pdf 近年来&#xff0c;情感计算在丰富人类与计算机和机器的交互方式方面备受关注。这一创新领域旨在通过理解和响应用户的情绪和心理状态&#xff0c;将人机交互转变得更加自然和直观。无论是情感识别、面部表情分…

DAY74

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QPainter> //画家类 #include <QTimer> //定时器类 #include <QTime> //时间类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : …

C#使用TCP-S7协议读写西门子PLC(五)-测试程序

上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…

高并发内存池项目(3)——项目框架介绍与实现线程池

一&#xff0c;项目的整体架构 这个高并发内存池的主要分为三层&#xff0c;分别是TheradCache层&#xff0c;CentralCache层&#xff0c;PageCache层。如下图所示&#xff1a; 二&#xff0c;原理讲解 当我们来了一个任务要申请内存时&#xff0c;先经过第一层ThreadCache。…

基于AI+多技术融合在流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务在环境保护与资源管理中具有不可替代的重要性。随着全球气候变化和人类活动对自然环境的压力日益增大&#xff0c;流域生态系统的稳定性和健康状况面临严峻挑战。水资源短缺、洪水频发、水质污染、生物多样性减少等问题&#xff0c;正在威胁流域内及其下游区域…

STMCuBeMX新建项目的两种匪夷所思的问题

错误一、保存地址名中有中文 错误&#xff1a;error1-haveCHinese_有中文\error1-haveCHinese_有中文.axf: error: L6002U: Could not open file error1-havechinese_???\stm32f1xx_it.o: No such file or directory 解决方法&#xff1a;重新导出&#xff0c;并且不要用中文…

Bandicam录制视频发白(过曝)如何解决?

Bandicam录制视频发白&#xff08;过曝&#xff09;如何解决&#xff1f; 一&#xff0c;问题现象二&#xff0c;解决方法 一&#xff0c;问题现象 录制视频时&#xff0c;视频播放的颜色比笔记本电脑上的颜色差别比较大&#xff0c;显示比实际的颜色发白。 二&#xff0c;解…

会计确认数据资产相关问题解读:权属和合规

会计确认数据资产相关问题中的权属和合规性是企业必须深入理解和重视的两个方面。 企业会计准则上明确了资产&#xff1a;企业合法拥有和控制的&#xff0c;预期会给企业带来经济利益的资源都叫资产。如何理解数据资产的权属及合规&#xff1f;如何确保企业合法拥有、控制数据…

Java 入门指南:Java 并发编程 —— 同步工具类 CyclicBarrier(循环屏障)

文章目录 同步工具类CyclicBarrier构造函数常用方法工作机制使用步骤适用场景CyclicBarrier与CountDownLatch的区别示例代码 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff…