C++11:基于C++98的语法更新

一、简介

在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增加的语法特性非常多,本文主要讲解实际中比较实用的语法。

二、统一的列表初始化方式

2.1{}初始化

在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扩大了用大括号括的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加

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()
{//C++98 构造Date d1(2024, 4, 1); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 4, 2 };Date d3 = { 2024, 4, 3 };Date* darr1 = new Date[3]{d1,d2,d3};Date* darr2 = new Date[3]{ { 2024, 3, 23 } ,{ 2024, 3, 23 } ,{ 2024, 3, 23 } };Date* darr3 = new Date(2023,3,34);Date* darr4 = new Date{ 2023, 3, 34 };return 0;
}

温馨提示:虽然这种方式使得初始化朝着大一统的方向发展,但是博主本人依然觉得使用起来及其的别扭和不舒适,加上很多早期代码或编译器不支持这种方式,博主个人建议还是按照原来的习惯将=加上,以免出现意料之外的情况发生。 

2.2std::initializer_list

而相比于我们自己定的日期类,vector定义了一个v1以后为什么可以不断往内部插入数据呢?

因为vector支持了initializer_list

2.3vector对initializer_list的应用

 

如果给auto il 赋值一个{}这时就会认定为这个类型为initializer_list,这个容器不实际存储数据,只是一个临时的数组,此临时数组的生命周期和initializer_list对象的生存周期相同。底层用了一个临时数组将它存起来,本质上是放到了常量区 ,里面通过两个指针,一个begin()指向数组的开头一个指针end()指向数组的结尾。验证如下:

 所以这里是一个initializer_list的构造,可以传任意个数的对象,所以date调用构造是优化后的结果vector也是构造加拷贝构造调用initializer_list的构造,优化后为直接调用构造。

下图则为直接构造 。

同样的,map也支持 initializer_list的构造。

 而dict1就是先将kv1,kv2两个pair传给map中的 initializer_list,变成 initializer_list<pair<const string,string>>的类型


2.4map对initializer_list的应用

而第二个直接在初始化时显示的去写,而第二个之所以可以通过编译,得益于pair的拷贝构造函数,如果直接将“sort”和“排序”传给pair走构造则是const char*类型的,我们将其展开就是如下图的效果编译器依然可以通过,因为pair的拷贝构造重载了一个类模板,并不强制要求传过来的pair必须和当前的pair是同类型,可以看到其中一个拷贝构造的参数为pair类型的引用。

 实现方式如下图所示: 使用了函数模板的方式来进行拷贝构造,可用性非常强。

  三、auto

auto不言而喻,在之前学习c++时就已经了解过了。

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

int main()
{int i = 10;auto p = &i;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 it = dict.begin();return 0;
}

c++11之后的版本中auto还可以用作返回值,但博主并不推荐使用auto作为返回值,因为这样在后期回看代码时会造成非常大的阻碍。至少博主不会这样进行使用。

注意:提到auto好多同学都会想到python,认为python慢的原因和auto语法有关,实际上并不是这样,它慢的原因是因为python不编译,它是边编译边运行,它不像c++/c一样先编译好后在运行。

四、decltype

int main()
{const int x = 1;double y = 2.2;cout << typeid(x).name() << endl;cout << typeid(string).name() << endl;decltype(x) z = 1;cout << typeid(z).name() << endl;const int* p1 = &x;cout << typeid(p1).name() << endl;decltype(p1) p2 = nullptr;cout << typeid(p2).name() << endl;auto ret = func1();// 假设要用vector存func1的数据vector<decltype(ret)> v;return 0;
}


 

它和typeid有些许相同,typeid可以帮助我们去打印类型。可以将底层原生的类可以打出来。

关键字decltype将变量的类型声明为表达式指定的类型。可以在定义对象时进行使用,让编译器去进行推导。

这个z则会定义为int 它会自动去掉1作为常量所带的那个const,而p1则不会去掉const,因为const修饰的是p1所指向的内容而不是p1本身,而还有一种说法将其成为顶层const和底层const,底层修饰的是其所指向的内容,顶层修饰的是变量自身。

 举例:假设一个函数返回一个auto类型,我们就可以用decltype进行实例化推导。

五、STL新容器

大部分在之前博客中已经介绍过了 。

forward_list则是单链表又是一个让博主想吐槽的点,没什么用,不支持双向迭代器,insert只能在当前位置之后去插入,因为没有prev所以不能头插。

 array静态数组,有栈溢出的风险。

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

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

相关文章

【机器学习】数据探索---python主要的探索函数

在上一篇博客【机器学习】数据探索(Data Exploration)—数据质量和数据特征分析中&#xff0c;我们深入探讨了数据预处理的重要性&#xff0c;并介绍了诸如插值、数据归一化和主成分分析等关键技术。这些方法有助于我们清理数据中的噪声、消除异常值&#xff0c;以及降低数据的…

设计模式-概述篇

1. 掌握设计模式的层次 第1层&#xff1a;刚开始学编程不久&#xff0c;听说过什么是设计模式第2层&#xff1a;有很长时间的编程经验&#xff0c;自己写了很多代码&#xff0c;其中用到了设计模式&#xff0c;但是自己却不知道第3层&#xff1a;学习过了设计模式&#xff0c;…

MATLAB 自定义生成圆柱点云(49)

MATLAB 自定义生成圆柱点云(49) 一、算法介绍二、具体实现1.代码2.效果一、算法介绍 按照一些提前指定的圆柱参数,自定义生成圆柱点云,可添加噪声,用于后续的实验测试 二、具体实现 1.代码 代码如下(示例): % 指定圆柱的参数 radius = 5; % 圆柱半径 height = 20…

springcloud基本使用三(搭建nacos)

window下安装nacos: 下载页面:Releases alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications. - Releases alibaba/nacoshttps://github.com/alibaba/nacos/releases…

医药行业CRM解决方案:如何选择适合的医药CRM系统?

医药市场的竞争也同样激烈&#xff0c;抓住市场、抢占客户拼的是产品、速度&#xff0c;更是精细化的客户管理。如何抓住客户&#xff0c;并留住客户&#xff0c;是医药公司要考虑的问题。人工机械地记录数据信息很容易就被市场淘汰&#xff0c;所以医药公司也需要用数字化工具…

大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?

自 2017 年发表“ Attention Is All You Need ”论文以来&#xff0c;Transformer 架构一直是自然语言处理 (NLP) 领域的基石。它的设计多年来基本没有变化&#xff0c;随着旋转位置编码 (RoPE) 的引入&#xff0c;2022年标志着该领域的重大发展。 旋转位置嵌入是最先进的 NLP…

一文get,最容易碰上的接口自动化测试问题汇总

本篇文章分享几个接口自动化用例编写过程遇到的问题总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格&#xff1a;由于有些字段判断是变量&#xff0c;需要将sql拼接起来&#xff0c;但是在拼接字符串时没有…

Python接口自动化测试-篇1(postman+requests+pytest+allure)

Python接口自动化测试是一种使用Python编程语言来编写脚本以自动执行针对应用程序接口&#xff08;APIs&#xff09;的测试过程。这种测试方法专注于检查系统的不同组件或服务之间的交互&#xff0c;确保它们按照预期规范进行通信&#xff0c;而不涉及用户界面&#xff08;UI&a…

CVE-2021-38001:TianfuCup RCE bug Type confusion in LoadIC::ComputeHandler

文章目录 前言环境搭建漏洞分析漏洞利用总结参考 前言 该漏洞在似乎在 bugs.chromium 上没有公开&#xff1f;笔者并没有找到相关漏洞描述&#xff0c;所以这里更多参考了别人的分析。 本文需要一定的 ICs 相关知识&#xff0c;请读者自行先查阅学习&#xff0c;比较简单&…

国内ip怎么来回切换:操作指南与注意事项

在数字化时代&#xff0c;互联网已经成为我们日常生活、学习和工作中不可或缺的一部分。然而&#xff0c;随着网络应用的不断深化&#xff0c;用户对于网络环境的稳定性和安全性要求也越来越高。其中&#xff0c;IP地址作为网络中的关键标识&#xff0c;其切换与管理显得尤为重…

Navicat 干货 | 通过检查约束确保 PostgreSQL 的数据完整性

数据完整性对于任何数据库系统来说都是很重要的一方面&#xff0c;它确保存储的数据保持准确、一致且有意义的。在 PostgreSQL 中&#xff0c;维护数据完整性的一个强大工具是使用检查约束。这些约束允许你定义数据必须遵守的规则&#xff0c;以防止无效数据的插入或修改。本文…

matlab 复制点云

目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述

Leetcode 617. 合并二叉树

心路历程&#xff1a; 看到两颗二叉树的问题&#xff0c;第一反应想到了同频遍历&#xff0c;然后每一步创建新的结点&#xff0c;虽然也写出来了但是代码比较长&#xff0c;而且空间复杂度比较高&#xff0c;好处是没有修改原始的两个二叉树的结果。 后来看了网上的解答&…

工业以太网交换机 vs. 常规以太网交换机:全面详细比较

概述 以太网交换机是现代计算机网络中的关键设备&#xff0c;用于连接各种设备&#xff0c;实现数据传输和通信。工业以太网交换机和常规以太网交换机之间存在一些重要区别&#xff0c;涉及到应用环境、设计、性能和功能。让我们深入探讨这些方面&#xff0c;帮助您更好地理解…

kind+tidb

官网介绍&#xff1a;在 Kubernetes 上快速上手 TiDB | PingCAP 文档中心 下面是具体细节&#xff1a; 一、安装 1.安装kind&#xff0c;一定要使用最新版本&#xff01;&#xff01;&#xff01; kind官网&#xff1a;kind – Quick Start curl -Lo ./kind https://kind.s…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…

代码随想录训练营day27

第七章 回溯算法part03 1.LeetCode. 1.1题目链接&#xff1a;39. 组合总和 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;题目中的无限制重复被选取&#xff0c;吓得我赶紧想想 出现0 可咋办&#xff0c;然后看到下面提示&#xff…

boost::asio::ip::tcp/udp::socket::release 函数为什么限制 Windows 8.1 才可以调用?

如本文题目所示&#xff0c;这是因为只有在 Windows 8.1&#xff08;Windows Server 2012 RC&#xff09;及以上 Windows 操作版本才提供了运行时&#xff0c;修改/删除完成端口关联的ABI接口。 boost::asio 在 release 函数底层实现之中是调用了 FileReplaceCompletionInform…

【Linux】权限理解

权限理解 1. shell命令以及运行原理2. Linux权限的概念3. Linux权限管理3.1 文件访问者的分类&#xff08;人&#xff09;3.2 文件类型和访问权限&#xff08;事物属性&#xff09;3.2.1 文件类型3.2.2 基本权限 3.3 文件权限值的表示方法3.4 文件访问权限的相关设置方法3.4.1 …