【C++】—— 简述C++11新特性

序言:

  • 从本期开始,我将会带大家学习的是关于C++11 新增的相关知识!废话不多说,我们直接开始今天的学习。

目录

(一)C++11简介

(二)统一的列表初始化

1、{}初始化

2、std::initializer_list

(三)声明

1、auto

2、decltype

3、nullptr

(四)范围for循环

(五)STL中一些变化

总结


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

  • 大家在学习过程中也可以参考文档:C++11 - cppreference.com

知识拓展
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。


(二)统一的列表初始化

接下来,我们将正式开始学习C++11 的第一个新增特性——有关统一的列表初始化的相关知识!

1、{}初始化

使用大括号 {} 进行初始化可以在不同的情况下提供一致的行为,并且具有一些特殊的初始化规则和语义。

下面是一些 C++11 中使用大括号进行初始化的示例:

  • 直接初始化:
int main()
{int x{ 42 }; // 使用大括号直接初始化 x 为 42string str{ "Hello" }; // 使用大括号直接初始化字符串对象cout << x << endl;cout << str << endl;return 0;
}

输出展示:

 

  • 默认初始化:
int main()
{int x{}; // 使用大括号进行默认初始化,x 的值为 0string str{}; // 使用大括号进行默认初始化,str 为空字符串cout << x << endl;cout << str << endl;return 0;
}

输出展示:

  •  数组或结构体初始化

在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 x1 = 1;int x2{ 2 };cout << x1 << endl;cout << x2 << endl;return 0;
}

输出展示:

 因此,对于上述结构体和数组的初始化操作,在C++11中可以转化为下面这样:

struct Point
{int _x;int _y;
};
int main()
{//c++98/*int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };*///c++11int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };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()
{// old styleDate d1(2022, 1, 1); // C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };return 0;
}

输出展示:

 【解释说明】

  • 这里的本质是构造+拷贝构造,经过优化后。如果不想编译器进行优化设置,可以加上 explicit即可。

 【小结】

  1. 使用大括号初始化在很多情况下都比传统的赋值或括号初始化更加安全和灵活;
  2. 它可以用于解决窄化转换问题,提供统一的初始化语法,并且可以进行更严格的类型检查。

2、std::initializer_list

std::initializer_list 是 C++11 引入的标准库类型,用于方便地表示初始化列表。它是一个轻量级的容器类,用于存储一组相同类型的值。

使用 std::initializer_list 可以将一组值作为参数传递给函数或构造函数,或者用于对象的初始化。它的语法类似于大括号 {} 初始化,但提供了更灵活的传递和使用方式。

下面是一些 std::initializer_list 的常见用法:

  • 作为参数传递给函数
void Point(initializer_list<int> values) {for (const auto& value : values) {cout << value << " ";}cout << endl;
}int main() {Point({ 1, 2, 3, 4 }); // 使用初始化列表作为参数return 0;
}

输出展示:

 


  • 作为对象的构造函数参数
class MyClass {
public:MyClass(initializer_list<int> values) {// 在构造函数中使用初始化列表for (const auto& value : values) {// 处理每个值cout << value << " ";}}
};int main() 
{MyClass obj({ 1, 2, 3, 4 }); // 使用初始化列表作为构造函数参数return 0;
}

输出展示:

 


  • 在范围基于循环中使用
int main()
{initializer_list<int> values = { 1, 2, 3, 4 };for (const auto& value : values) {// 处理每个值cout << value << " ";}return 0;
}

输出展示:

 


std::initializer_list 的主要优点是它提供了一种简洁、直观的方式来传递初始化列表,特别适用于带有不确定数量参数的函数或构造函数。它允许以类似于标准容器的方式进行遍历和访问其中的值。

 那是因为在 C++11 中,学从vector 提供了以下构造函数:

 


注意std::initializer_list  是一个只读容器,不能进行元素的插入、删除或修改。它的元素类型是常量,因此通常会使用 const auto& 来遍历元素。

1.插入报错

 

2.删除报错

 

3.修改报错

 

【小结】

  • 总之,std::initializer_list 提供了一种简洁而方便的方式来处理初始化列表,并且在 C++11 及更高版本中广泛使用;
  • 它使我们能够以一种更直观、类型安全的方式处理初始化列表,并简化了函数和构造函数的参数传递。

(三)声明

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

1、auto

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

下面是一些关于 auto 的使用示例:

  • 自动类型推断
int main()
{auto num = 42; // 推断 num 的类型为 intauto str = "Hello"; // 推断 str 的类型为 const char*auto arr = std::vector<int>(); // 推断 vec 的类型为 std::vector<int>return 0;
}

输出展示:

 在这些示例中,auto 关键字根据变量的初始化表达式推断出变量的类型,并相应地声明变量。


  • 与范围基于循环结合使用(这个我们一直都在用就不多说了)

 

  • 函数返回类型推断
auto add(int a, int b) {return a + b;
}

在这个示例中,auto 用于推断函数的返回类型。根据返回表达式的类型,编译器会自动推断出函数的返回类型。


【小结】

  1. auto 推断的类型是在编译时确定的,而不是运行时。这意味着使用 auto 声明的变量在编译时会根据初始化表达式的类型进行类型推断,然后在后续的代码中被视为具有确定的类型。
  2. 另外,由于 auto 是根据初始化表达式推断类型,因此在一些情况下可能会导致意外的类型推断结果或不明确的类型。在这些情况下,可以使用显式的类型声明或其他更具体的类型推断工具(例如类型转换操作符)来消除歧义。

2、decltype

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

代码举例:

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

输出展示:

 


3、nullptr

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

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

(四)范围for循环

这个我们在前面的课程中已经进行了非常详细的讲解,这里就不进行讲解了。


(五)STL中一些变化

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

 


总结

以上便是本期关于 C++11 新特性的介绍。以上内容在校招中属于了解内容,大家知道会用即可!

 

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

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

相关文章

百望云华为云共建零售数字化新生态 聚焦数智新消费升级

零售业是一个充满活力和创新的行业&#xff0c;但也是当前面临很大新挑战和新机遇的行业。数智新消费时代&#xff0c;数字化转型已经成为零售企业必须面对的重要课题。 8 月 20 日-21日&#xff0c;以“云上创新 韧性增长”为主题的华为云数智新消费创新峰会2023在成都隆重召…

爬虫selenium获取元素定位方法总结(动态获取元素)

目录 元素 查看元素信息 元素定位 通过元素id定位 通过元素name定位 通过xpath表达式定位 绝对路径 相对路径 通过完整超链接定位 通过部分链接定位 通过标签定位 通过类名进行定位 通过css选择器进行定位 id选择器 class选择器 标签选择器 属性选择器 定位带…

蓝帽杯半决赛2022

手机取证_1 iPhone手机的iBoot固件版本号:&#xff08;答案参考格式&#xff1a;iBoot-1.1.1&#xff09; 直接通过盘古石取证 打开 取证大师和火眼不知道为什么都无法提取这个 手机取证_2 该手机制作完备份UTC8的时间&#xff08;非提取时间&#xff09;:&#xff08;答案…

技术的巅峰演进:深入解析算力网络的多层次技术设计

在数字化时代的浪潮中&#xff0c;网络技术正以前所未有的速度演进&#xff0c;而算力网络作为其中的一颗明星&#xff0c;以其多层次的技术设计引领着未来的网络构架。本文将带您深入探索算力网络独特的技术之旅&#xff0c;从底层协议到分布式控制&#xff0c;为您呈现这一创…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

cuml机器学习GPU库 sklearn升级版AutoDL使用

CUML库 最近在做机器学习任务的时候发现我自己的数据集太大&#xff0c;直接用sklearn 跑起来时间很长&#xff0c;然后问GPT得知了有CUML库&#xff0c;后来去研究了一下&#xff0c;发现这个库只支持linux系统&#xff0c;从官网直接获取下载命令基本上也实现不了最后&#…

outlook等客户端报错:-ERR Login fail. Please using weixin token to login

使用outlook配置腾讯邮箱后&#xff0c;无法收取邮件&#xff0c;点击接收/发送所有文件夹&#xff0c; 提示报错&#xff1a; 任务“testqq.com - 正在接收”报告了错误(0x800CCC92):“电子邮件服务器拒绝您登录。请在“帐户设置”中验证此帐户的用户名及密码。 响应服务器:…

详细介绍线程池的使用原理、参数介绍、优点、常见构造方法、使用案例、模拟实现

前言 创建和销毁一个线程时&#xff0c;这点损耗是微不足道的&#xff0c;但是当需要频繁的创建和销毁多个线程时&#xff0c;这个成本是不可忽视的&#xff0c;于是就有大佬创建了线程池&#xff0c;借助线程池来减少其中的成本。 目录 前言 一、线程池的使用原理 二、线程…

LVS集群 (NET模式搭建)

目录 一、集群概述 一、负载均衡技术类型 二、负载均衡实现方式 二、LVS集群结构 一、三层结构 二、架构对象 三、LVS工作模式 四、LVS负载均衡算法 一、静态负载均衡 二、动态负载均衡 五、ipvsadm命令详解 六、搭建实验流程 一、首先打开三台虚拟机 二、…

【云计算】Docker特别版——前端一篇学会

docker学习 文章目录 一、下载安装docker&#xff08;一&#xff09;Windows桌面应用安装&#xff08;二&#xff09;Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…

【FAQ】H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

如何声明一个全局变量?有什么注意事项?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 声明全局变量⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

聊聊智慧城市的发展

目录 1.智慧城市应该是什么样子 2.智慧城市的实现方案 3.智慧城市会给人们造成的影响 1.智慧城市应该是什么样子 智慧城市是一种基于信息和通信技术的先进城市管理模式&#xff0c;旨在提高城市的运行效率、居民生活质量和可持续发展。智慧城市整合了各种智能设备、传感器、…

二叉树搜索

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——二叉搜索树☂️<3>开发环境 &#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;在之前的我们已经学过了普通二叉树&#xff0c;了解了基本的二叉树…

[Go版]算法通关村第十四关青铜——原来这就是堆

目录 堆的概念和特征父子关系&#xff1a;(i-1)/2 堆的构造过程自底向上堆化&#xff08;Bottom-up Heapify&#xff09;举例 自顶向下堆化&#xff08;Top-down Heapify&#xff09; 插入操作举例 删除操作举例 堆结构的价值口诀 堆的概念和特征 堆是一个很大的概念&#xff0…

ssm汽车养护管理系统源码和论文

ssm汽车养护管理系统038 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 开题报告内容&#xff1a;&#xff08;研究现状、目的意义&#xff1b;基本内容、研究方法、参考文献等。&#xff09; 研究现状 国外…

driver‘s license exam 4

driver‘s license exam 1_spencer_tseng的博客-CSDN博客 driver‘s license exam 2_spencer_tseng的博客-CSDN博客 driver‘s license exam 3_spencer_tseng的博客-CSDN博客 driver‘s license exam 4_spencer_tseng的博客-CSDN博客 car indicator light_spencer_tseng的博…

java八股文面试[数据结构]——ArrayList和LinkedList区别

ArrayList和LinkedList的异同 二者的线程都不安全&#xff0c;相对线程安全的Vector,执行效率高。此外&#xff0c;ArrayList时实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构&#xff0c;对于随机访问get和set&#xff0c;ArrayList觉得优于LinkedLis…

ubuntu上使用osg3.2+osgearth2.9

一、介绍 在ubuntu上使用osgearth加载三维数字地球&#xff0c;首先要有osg和osgearth的库&#xff0c;这些可以直接使用apt-get下载安装&#xff0c;但是版本有些老&#xff0c;如果需要新版本的就需要自己编译。 #查看现有版本 sudo apt-cache madison openscenegraph #安装…