【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即可。

【小结】
- 使用大括号初始化在很多情况下都比传统的赋值或括号初始化更加安全和灵活;
- 它可以用于解决窄化转换问题,提供统一的初始化语法,并且可以进行更严格的类型检查。
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 用于推断函数的返回类型。根据返回表达式的类型,编译器会自动推断出函数的返回类型。
【小结】
auto推断的类型是在编译时确定的,而不是运行时。这意味着使用auto声明的变量在编译时会根据初始化表达式的类型进行类型推断,然后在后续的代码中被视为具有确定的类型。- 另外,由于
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 新特性的介绍。以上内容在校招中属于了解内容,大家知道会用即可!

相关文章:
【C++】—— 简述C++11新特性
序言: 从本期开始,我将会带大家学习的是关于C11 新增的相关知识!废话不多说,我们直接开始今天的学习。 目录 (一)C11简介 (二)统一的列表初始化 1、{}初始…...
协议的分层结构
1.1TCP/IP 协议 为了使各种不同的计算机之间可以互联,ARPANet指定了一套计算机通信协议,即TCP/IP 协议(族). 注意TCP /IP 协议族指的不只是这两个协议 而是很多协议, 只要联网的都使用TCP/IP协议族 为了减少 协议设计的复杂度 ,大…...
Linux下彻底卸载jenkins
文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…...
Nebula基础的查询操作介绍
Nebula基础的查询操作介绍 这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph 关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。 …...
C++ STL序列式容器(详解)
STL基础 C STL基本组成(6大组件13个头文件) 通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,它们各自的含义如表 1 所示。 表 1 STL 组成…...
C++获取map最小值算法,STL---std::min_element()!
std::min_element 定义于头文件 <algorithm> 以下是API文档说明! 寻找范围 [first, last) 中的最小元素。 1) 用 operator< 比较元素。 3) 用给定的二元比较函数 comp 比较元素。 2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is…...
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
windows一键启动jupyter
windows一键启动jupyter jupyter简介 Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...
树形结构的快速生成
背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
