C++第四十一弹---C++11新特性深度解析:让你的代码更现代、更高效(上)

news2024/11/17 17:42:57

 ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】

目录

1. C++11简介

2. 统一的列表初始化

2.1 {}初始化

2.2 std::initializer_list

3. 声明

3.1 auto

3.2 decltype

3.3 nullptr

3.4 STL中一些变化


1. C++11简介

阶段内容
C with
classes
类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符
重载等
C++1.0添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静
态成员以及const成员函数
C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处
C++98C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美
国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05C++标准委员会发布了一份计数报告(Technical Report,TR1),正式更名
C++0x,即:计划在本世纪第一个10年的某个时间发布
C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循
环、auto关键字、新容器、列表初始化、标准线程库等
C++14对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表
达式,auto的返回值类型推导,二进制字面常量等
C++17在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文
本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协
程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有
特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23制定ing



在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增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程
主要讲解实际中比较实用的语法。

C++11官网icon-default.png?t=N7T8https://en.cppreference.com/w/cpp/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中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:

// 1、{}初始化
struct Point
{
	int _x;
	int _y;
};
int main()
{
	// C语言中支持数组使用{}花括号初始化
	int array1[] = { 1,2,3,4,5 };
	int array2[5] = { 0 };
	int array3[5]{ 0 };// 可以不加=

	// C语言中结构体支持使用{}初始化
	Point p = { 1,2 };

	return 0;
}

测试结果 

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

代码演示

struct Point
{
	int _x;
	int _y;
};
int main()
{
	int x1 = 1;
	int x2{ 2 };
	int array1[]{ 1, 2, 3, 4, 5 };
	int array2[5]{ 0 };
	Point p{ 1, 2 };
	// C++11中列表初始化也可以适用于new表达式中
	int* pa = new int[4] { 0 };
	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); // C++11之前,旧的方式
	// C++11支持的列表初始化,这里会调用构造函数初始化
	Date d2{ 2022, 1, 2 };
	Date d3 = { 2022, 1, 3 };
	return 0;
}

测试结果 

2.2 std::initializer_list


std::initializer_list的介绍文档:

initializer_list文档icon-default.png?t=N7T8https://cplusplus.com/reference/initializer_list/initializer_list/

std::initializer_list是什么类型:

代码演示

int main()
{
    auto il = { 1,2,3 };
    initializer_list<int> il2 = { 4,5,6 };
    cout << typeid(il).name() << endl;
    return 0;
}

测试结果 

std::initializer_list使用场景:
std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。

代码演示

int main()
{
	vector<int> v1(10,1);
	// 构造
	vector<int> v2({ 1,2,3,4,5 });
	// initializer_list
	vector<int> v3 = { 1,3,5,7,9 };
	vector<int> v4{ 2,4,6,8,10 };

	pair<string, string> kv1("insert","插入");
	pair<string, string> kv2("left", "左边");

	map<string, string> dict1 = { kv1,kv2 };

	// 1、pair多参数隐式类型转换
	// 2、initializer_list构造
	map<string, string> dict = { {"right","右边"},{"string","字符串"} };
	return 0;
}

测试结果 

3. 声明


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

3.1 auto


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

代码演示

int main()
{
	int i = 10;
	auto p = &i;
	// 函数指针,将函数地址传给pf
	auto pf = strcpy;
	cout << typeid(p).name() << endl;
	cout << typeid(pf).name() << endl;
	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
	// map<string, string>::iterator it = dict.begin();
	// 原本类型如上,很长,使用auto可以自动推导类型,且很短
	auto it = dict.begin();
	return 0;
}

测试结果 

注意:auto有一个缺陷,当使用auto为函数的返回类型时,代码可读性不强,因为函数内部可能嵌套了很多函数。

auto func1()
{
	list<int> lt;
	auto ret = lt.begin();
	// ret为链表迭代器的第一个位置,不能够快速确定返回类型是什么
	return ret;
}

 如上代码,只使用了一个函数就很难确定func1函数的返回类型是什么。

3.2 decltype


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

代码演示

template<class T>
class B
{
public:
	T* New(int n)
	{
		return new T[n];
	}
};
auto func1()
{
	list<int> lt;
	auto ret = lt.begin();
	// ret为链表迭代器的第一个位置,不能够快速确定返回类型是什么
	return ret;
}
int main()
{
	list<int>::iterator it;
	// typeid推出是一个单纯的字符串
	cout << typeid(it).name() << endl;
	 不能用来定义对象
	//typeid(it).name() it1;
	// 可以用来定义对象
	decltype(it) it2;
	cout << typeid(it2).name() << endl;
	auto it3 = it2;
	cout << typeid(it3).name() << endl;
    // 不知道func1函数返回什么类型,但是可以通过返回的类型实例化对象
	auto ret = func1();
	B<decltype(ret)> bb1;
	map<string, string> dict = { {"string","字符串"},{"left","左边"} };
	auto it4 = dict.begin();
	B<decltype(it4)> bb2;
	// 与上面代码实例化类型一样,但是长度更长
	B<std::map<std::string, std::string>::iterator> bb3;
	return 0;
}

测试结果 

3.3 nullptr


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

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

3.4 STL中一些变化


新容器


用橘色圈起来是C++11中的一些几个新容器,但是实际最有用的是unordered_map和
unordered_set。这两个我们前面已经进行了非常详细的讲解,其他的uu了解一下即可。

容器中的一些新方法


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

但是这些接口到底意义在哪?网上都说他们能提高效率,他们是如何提高效率的?
请看下面的右值引用和移动语义章节的讲解。另外emplace还涉及模板的可变参数,也需要再继
续深入学习后面章节的知识。 

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

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

相关文章

arcgis依据字段分组

脚本代码&#xff1a; UniqueDict {} def isDuplicateIndex(inValue): UniqueDict.setdefault(inValue,0) UniqueDict[inValue] 1 return UniqueDict[inValue] 输出值 isDuplicateIndex( !地块编号! )

临床试验中缺失数据的问题讨论

一、数据缺失的原因&#xff1a; &#xff08;1&#xff09;AE或疗效退出&#xff1b; &#xff08;2&#xff09;结局变量不适用&#xff08;无法获得结局变量&#xff09;&#xff1b; &#xff08;3&#xff09;失访&#xff1b; &#xff08;4&#xff09;数据采集失误&am…

云安全已经很好,但如何让它更好呢

尽管云计算很安全&#xff0c;但并不能完全避免数据泄露。随着云计算逐渐成为IT的重要部分&#xff0c;现在企业必须更认真地考虑如何加强云服务提供商默认安全基础设施的安全性。 传统云服务提供商都在努力为其客户提供强大的安全措施&#xff0c;他们通常会提供服务器端加密…

佰朔资本:市场转机正在逐步孕育 关注银行、电力等板块

商场起色正在逐渐孕育。中报宣布期即将以前&#xff0c;商场将完结盈利预期下修&#xff0c;一同美联储9月降息信号激烈&#xff0c;若协作国内方针加码发力信号&#xff0c;商场有望翻开向上空间。短期除高胜率的稳定盈利资产和中报超预期且景气继续方向&#xff0c;亦可注重中…

ES(索引数据库)导入MySQL全量(批量导入)和增量数据Canal增量数据同步利器

索引库数据管理 秒杀商品数量庞大&#xff0c;我们要想实现快速检索&#xff0c;不建议直接使用关系型数据库查找。不建议使用Redis缓存所有数据&#xff0c;因为秒杀商品量大&#xff0c;会影响Redis的性能&#xff0c;并且Redis的条件检索能力偏弱。我们可以使用Elasticsear…

Linux:NAT等相关问题

目录 1&#xff1a;NAT背景 2&#xff1a;NAT IP转换过程 3&#xff1a;NATP 4&#xff1a;正向代理 5&#xff1a;反向代理 6&#xff1a;NAT和代理服务器 应用场景 实现方法 1&#xff1a;NAT背景 IPv4地址耗尽&#xff1a;随着互联网的迅速发展&#xff0c;连接到…

[Leetcode 105][Medium] 从前序与中序遍历序列构造二叉树-递归

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 题目地址 二、整体思路 前序遍历得到的是[根结点|左子树|右子树]&#xff0c;中序遍历得到的是[左子树|根结点|右子树] 那么可以设立一个递归函数&#xff0c;作用是利用前序遍历的数组和中序遍历的数组构建一个节点…

汇川技术|Inoproshop软件菜单[在线、调试]

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 现如今学习资源是容易获取了&#xff0c;像我网盘里堆了7T的资料&#xff0c;有很多还没看过&#xff0c;总是见到了就收藏起来&#xff0c;但是真的看不过来啊。有时间和精力的小伙伴可以找自己感兴趣的看起来。 本…

景商场双目客流量摄像机,具有100°宽视角,识别范围广

在当今竞争激烈的商业环境中&#xff0c;商场管理者们一直在寻求更有效的方法来了解顾客行为、优化运营策略。商场双目客流量摄像机的出现&#xff0c;为商场管理带来了新的机遇。 一、功能强大 商场双目客流量摄像机具有多项强大功能。首先&#xff0c;它拥有 100 宽视角&…

雷达水文监测站

雷达水文监测站是一种利用雷达技术进行水文监测的设备&#xff0c;其功能主要包括以下几个方面&#xff1a; 水位监测&#xff1a;雷达水文监测站可以实时监测水体的水位变化&#xff0c;通过测量水面到雷达发射器的距离来计算水位。 流量监测&#xff1a;根据水位的变化&…

西门子一个PLC两个HMI分别显示不同报警内容

当前项目为一个PLC带两个HMI&#xff0c;功能上两个站完全分离&#xff0c;但是为了避免重复绘制HMI&#xff0c;先将两个站点报警链接到同一个HMI上&#xff0c;同时又需要指定站点的HMI单独显示该站点的报警&#xff1b;否则会出现如下情况&#xff0c;两个站都显示全部的报警…

传输大咖33 | 适合企业内外网文件交换系统是怎样的?

企业的内外网文件交换是企业日常运营的重要环节。然而&#xff0c;随着技术的发展&#xff0c;企业的文件数据量日益增长&#xff0c;文件的格式也越来越复杂多样。传统的内外网文件交换方式也逐渐显露出不足之处&#xff0c;对于企业来说&#xff0c;寻求更加高效、安全、可靠…

YOLOv9改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

Word文件密码忘记,该如何才能编辑Word文件呢?

Word文件打开之后&#xff0c;发现编辑功能都是灰色的&#xff0c;无法使用&#xff0c;无法编辑&#xff0c;遇到这种情况&#xff0c;是因为Word文件设置了限制编辑导致的。一般情况下&#xff0c;我们只需要输入Word密码&#xff0c;将限制编辑取消就可以正常编辑文件了&…

LLM大模型:生成式人工智能完全指南,240页pdf

《你最后一本需要的AI书籍。我们保证&#xff01;》 AI技术发展如此迅速&#xff0c;这本书可能已经过时了&#xff01;但别担心——《生成性AI完全过时指南》依然是任何想将生成性AI从玩具变成工具的人必读的书籍。无论未来如何变化&#xff0c;它都能教你如何充分利用AI。你…

FL Studio24.1.1.4239中文高级版破解补丁+永久免费激活码许可证

FL Studio 24.1.1.4239中文版&#xff0c;音乐制作人的“瑞士军刀” 在音乐制作的世界中&#xff0c;有一款软件被誉为“瑞士军刀”&#xff0c;那就是FL Studio 24.1.1.4239中文版。它不仅功能强大&#xff0c;而且界面友好&#xff0c;让音乐制作变得简单又有趣。今天&#…

大模型如何赚钱,杀手级应用是什么、创业机会在哪里?

除了通义大模型外&#xff0c;MiniMax、月之暗面、智谱AI、猎户星空、零一万物、百川智能六家大模型厂商已经与钉钉达成合作。目前&#xff0c;钉钉生态伙伴总数超过5600家&#xff0c;其中AI 生态伙伴已经超过100家&#xff1b;钉钉AI每天调用量超1000万次。 在下午的圆桌对话…

八种dll文件丢失怎么恢复的步骤分享,超全面介绍dll文件几解决方法

在使用Windows操作系统的过程中&#xff0c;我们时常会遇到程序运行错误提示&#xff0c;其中“DLL文件丢失”是一类非常典型的问题。这类错误不仅令人困扰&#xff0c;还可能阻碍软件或系统功能的正常使用。动态链接库&#xff08;DLL&#xff09;文件是Windows系统中的一个关…

LeetCode 精选 75 回顾

目录 一、数组 / 字符串 1.交替合并字符串 &#xff08;简单&#xff09; 2.字符串的最大公因子 &#xff08;简单&#xff09; 3.拥有最多糖果的孩子&#xff08;简单&#xff09; 4.种花问题&#xff08;简单&#xff09; 5.反转字符串中的元音字母&#xff08;简单&a…

基于大语言模型的医疗问答系统的设计与研究

目录 研究背景及意义 国内外研究现状 研究内容 研究方案与技术路线 大语言模型的基本原理 大语言模型的部署 大语言模型微调 大语言模型提示工程&#xff08;Prompt&#xff09; 大语言模型RAG技术 LangChain 多模态大语言模型 研究背景及意义 大语言模型&#xff0…