C++11中重要的新特性 Part one
序言
C++11 是 C++ 编程语言的一个重要版本,于 2011 年由国际标准化组织 (ISO) 和国际电工委员会 (IEC) 旗下的 C++ 标准委员会 (ISO/IEC JTC1/SC22/WG21) 正式公布,并于同年 9 月出版。其正式名称为 ISO/IEC 14882:2011 - Information technology – Programming languages – C++ 。C++11 是 C++98 发布后 13 年来的第一次重大修正,它引入了 140 多个新特性和改进,使得 C++ 语言更加现代化、易用和强大。
在这几篇文章中,笔者将介绍新特性中比较重要的那些,让大家感受到 C++11 为现代 C++ 编程带来的变革和增强。😆
1. 自动类型推导
1.1 auto 关键字
auto 允许编译器自动推导变量的类型,简化了变量声明。就比如:auto A = 1;
编译器会自动推导出 A
的类型是 int
,但是这种用法简直是大材小用😲,换一个复杂的场景,就要比如,我们现在有一个如下的 vector
:
std::vector<std::pair<std::string, int>> arr;
现在我们想要获取该 vector
的迭代器,正常流程应该是这样的吧:
std::vector<std::pair<std::string, int>>::iterator it = arr.begin();
但是现在有了 auto
之后,我们可以直接表示为:auto it = arr.begin();
。
虽然 auto
极大的便捷了我们的书写,但是会大大的降低代码的可读性😵,就比如:
auto Func(const int num){std::vector<int> arr;for(size_t i = 0; i < num; ++i){arr.push_back(i);}return arr;
}int main(){auto ret = Func(5);return 0;
}
原来我们一眼就能看出的返回值类型,现在需要需要到具体的函数查看大体细节。
总结起来就是,我们可以使用 auto
来便利我们的书写,但是我们不能依赖于他😖!
1.2 decltype 关键词
decltype
用于在编译时查询表达式的类型。decltype
可以避免显式地写出复杂的类型名称,特别是在模板编程、自动类型推导以及需要精确类型信息的场景中,就比如:
int main() { int x = 42; double y = 3.14; // 使用 decltype 推导 x 的类型 decltype(x) z = 100; // z 的类型是 int // 使用 decltype 推导表达式的类型 decltype(x + y) sum = x + y; // sum 的类型是 double return 0
}
2. 范围for循环
范围 for 循环
是 C++11 引入的一种新的循环语法,它简化了对容器(如 std::vector、std::list 等)或数组遍历的代码编写。范围for循环
能够自动处理容器的迭代过程,使得遍历容器元素变得更加直观和简洁。格式如下:
// Container 是具体的容器结构
for(auto elem : Container){// 对容器中元素的具体操作
}
在这里提一嘴:这个只能支持本身就支持可以遍历的容器,Stack,Queue等 容器本身不支持遍历的容器,是不支持的哈。
就比如我想要遍历我的 vector
中的元素,就可以表示为:
void test_1() {vector<int> arr = { 1, 2, 3 ,4 };for (auto e : arr) {cout << e << " ";}cout << endl;
}
2.1 遍历的元素为深拷贝
如果我想要利用 范围 for 循环
将我的所有 vector
元素加一,那是这样的吗:
void test_2() {vector<int> arr = { 1, 2, 3 ,4 };for (auto e : arr) {++e;}for (auto e : arr) {cout << e << " ";}cout << endl;
}
你可以发现,元素并未发生变化,这是因为 e是vector中每一个元素的深拷贝
,这个要牢记哈。那怎么解决呢?很简单:
for (auto& e : arr) {++e;}
我们只需要加上引用就好啦😚。当我们遍历时也通常加上引用符号,这是因为,如果不引用,容器中的元素都是需要动态申请空间的话,那遍历时拷贝的代价就太大了。
2.2 本质是使用了迭代器
你可以简单的认为 范围 for 循环
可以转化为如下形式:
void test_3() {vector<int> arr = { 1, 2, 3 ,4 };auto it = arr.begin();while (it != arr.end()) {cout << *it << " ";++it;}
}
所以说如果你想要你的自定义容器也支持 范围 for 循环
,那就必须要如下前提:
- 你的容器实现了迭代器
- 你的迭代器支持,++,!=
3. 统一的列表初始化
3.1 {} 用法
在 C++98 版本中我们可以使用 {}
对数组或者是结构体进行初始化:
class Test {
public:Test(int A, int B) {_A = A;_B = B;}
private:int _A;int _B;
};void test_4() {int arr[] = { 1, 2, 3, 4 };Test t1 = { 1, 2 };
}
在 C++11 中,{}
可以初始化的对象包括基本类型、复合类型(如结构体、类)以及 STL 容器等。这种语法提供了一种一致且清晰的初始化方式,避免了之前不同初始化方式可能带来的混淆和错误:
void test_5() {// 对内置类型初始化int A = { 1 };int B{ 2 }; // 甚至可以去除 = // 对容器初始化vector<int> arr = {1, 2, 3, 4};// 对自定义类型初始化Test t2{ 1, 2 };// 对 new 表达式初始化int* ptr = new int[2] {1, 2};delete[] ptr;
}
3.2 initializer_list — {} 背后的男人
{}
在背后是如何对容器进行初始化的呢?靠的是 initializer_list
。他具体是:
- 类型:
std::initializer_list<T>
是一个模板类,其中T
是列表中元素的类型。 - 用途:主要用于构造函数和函数调用的初始化列表中,允许以花括号
{}
包围的列表形式传递多个值。 - 特性:
initializer_list
是轻量级的,它不拥有它所包含的元素;它仅仅是对现有数据的引用。因此,使用initializer_list
时需要注意生命周期问题,确保initializer_list
引用的数据在initializer_list
被使用时仍然有效。
4. 关键字 override,final
override
override
修饰一个成员函数,代表你想要重写该函数,如果没有达到重写的条件就会报错。就比如:
final
当 final
修饰一个成员函数,代表该函数不可以被重写。就比如:
当 final
修饰一个类,代表该类不可以被继承。就比如:
5. 关键字 nullptr
在 C 语言中, NULL
的定义是:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)#endif
#endif
由于 C++ 中 NULL
被定义成字面量 0,这样就可能回带来一些问题,因为 0 既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11 中新增了 nullptr
,仅用于表示空指针。
6 总结
还有些重要的新特性,将在接下来的时间慢慢更新,特别重要的特性会作为大章节,详细讲解。
相关文章:

C++11中重要的新特性 Part one
序言 C11 是 C 编程语言的一个重要版本,于 2011 年由国际标准化组织 (ISO) 和国际电工委员会 (IEC) 旗下的 C 标准委员会 (ISO/IEC JTC1/SC22/WG21) 正式公布,并于同年 9 月出版。其正式名称为 ISO/IEC 14882:2011 - Information technology – Programm…...
VB 关键字
VB 关键字 Visual Basic(VB)是一种由微软开发的高级编程语言,广泛用于开发Windows桌面应用程序。在VB编程中,关键字是语言预定义的单词,具有特定的含义和用途。这些关键字不能被用作变量名或函数名,因为它们已经被编程语言赋予了特定的功能。 本文将详细介绍VB中的关键…...

Linux——多线程(四)
前言 这是之前基于阻塞队列的生产消费模型中Enqueue的代码 void Enqueue(const T &in) // 生产者用的接口{pthread_mutex_lock(&_mutex);while(IsFull())//判断队列是否已经满了{pthread_cond_wait(&_product_cond, &_mutex); //满的时候就在此情况下等待// 1.…...

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃
InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃 import java.net.InetAddress;public class GetHostIp {public static void main(String[] args) {try {long start System.currentTimeMillis();String ipAddress InetAddress.getLocalHost().getHostA…...
在 Qt6 中,QList 和 QVector 统一 成qlist了吗?
是的,在 Qt6 中,QList 和 QVector 已经被统一了。具体来说,QList 现在基本上就是 QVector 的一个别名。这一改变意味着 QList 和 QVector 具有相同的性能和行为特性。 在 Qt5 中,QList 有自己的内部实现,对小型对象&a…...

第三期书生大模型实战营 第1关 Linux 基础知识
第三期书生大模型实战营 第1关 Linux 基础知识 第三期书生大模型实战营 第1关 Linux 基础知识InternStudio开发机创建SSH密钥配置通过本地客户端连接远程服务器通过本地VSCode连接远程服务器运行一个Python程序总结 第三期书生大模型实战营 第1关 Linux 基础知识 Hello大家好&a…...
架构设计(1)分布式架构
分布式架构 分布式架构是一种将系统中的不同组件分布在多台计算机或节点上,通过网络进行通信和协作,以实现系统功能的架构设计。分布式架构通常用于构建大型、复杂的软件系统,具有高可伸缩性、高可用性和高性能等优点。下面是关于分布式架构…...

机器学习笔记:初始化0的问题
1 前言 假设我们有这样的两个模型: 第一个是逻辑回归 第二个是神经网络 他们的损失函数都是交叉熵 sigmoid函数的导数: 他们能不能用0初始化呢? 2 逻辑回归 2.1 求偏导 2.1.1 结论 2.1.2 L对a的偏导 2.1.3 对w1,w2求偏导 w2同…...

JavaWeb—js(3)
Bom dom: document object model(文档对象模型), 是处理html、xml的标准编写接口。 节点和元素 整个页面也就是整个文档我们称之为文档节点; 文档节点使用document来表示; 页面中的所有标签我们称之为元素,使用element来表示; 如此处的文本、属性、注释等&…...
PLSQL Day4
--使用显式游标更新行,对所有salesman增加500奖金: declare cursor s_cursor is select * from emp where job SALESMAN for update; begin for e_s in s_cursor loop update emp set comm nvl(comm,0)500 where current of s_cur…...
git合并报错:git -c core.quotepath=false -c log.showSignature=false merge r
这个错误通常发生在 Git 尝试合并两个没有共同祖先的历史时,比如在合并不同的分支或仓库时,可以尝试以下几种方法: 允许不相关历史的合并: git merge release-3.6 --allow-unrelated-histories这个选项告诉 Git 允许合并两个没有共同历史的分…...
云原生存储:使用MinIO与Spring整合
在现代云原生应用开发中,高效、可靠的存储解决方案是至关重要的。MinIO是一个高性能、分布式的对象存储系统,它与Amazon S3兼容,非常适合在Kubernetes等云原生环境中使用。本文将详细介绍如何在Spring Boot应用中整合MinIO,并提供…...
等保测评新趋势:应对数字化转型中的安全挑战
随着信息技术的飞速发展,数字化转型已成为企业提升竞争力、优化运营效率的重要手段。然而,这一转型过程中,企业也面临着前所未有的安全挑战。等保测评(信息安全等级保护测评)作为保障信息系统安全的重要手段࿰…...

使用esptool工具备份ESP32的固件(从芯片中备份下来固件)
本文以Windows电脑为例 板子为esp32-c3 1下载python 可在官网中下载,此处不进行讲解 使用如下代码查看是否安装了 Python(终端输入) python 2下载esptool 在终端输入如下代码即可下载 使用 pip(推荐): 在你已经安装的 Pyth…...
JS进阶-解析赋值
学习目标: 掌握解析赋值 学习内容: 解构赋值数组解构对象解构筛选数组filter方法(重点) 解构赋值: 解构赋值是一种快速为变量赋值的简洁语法,本质上仍然是为变量赋值。 分为: 数组解构对象解…...

Java虚拟机面试题汇总
目录 1. JVM的主要组成部分及其作用? 1.1 运行时数据区划分? 1.2 哪些区域可能会发生OOM? 1.3 堆和栈的区别? 1.4 内存模型中的happen-before是什么? 2. HotSpot虚拟机对象创建流程? 2.1 类加载过程…...
C++休眠的方法
Windows的API函数 Sleep(INFINITE); 休眠时间为永久 Linux的API函数sleep 没有直接表示无限时间的参数,根据POSIX标准,sleep() 函数的参数应该是 unsigned int 类型,因此最大可以接受的参数值是 UINT_MAX,即 4294967295 秒。sleep…...

选择排序(C语言版)
选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步&…...

基于CentOS Stream 9平台搭建FRP内网穿透
内网穿透方法很多,本文以github上很火的frp为例 1.frp官方 文档:https://gofrp.org/zh-cn/docs/overview/ 1.1 下载 https://github.com/fatedier/frp/releases 选中合适的版本 2. 服务端(服务器)搭建frps 需要公网IP服务器 选…...

Redis管理禁用命令
在redis数据量比较大时,执行 keys * ,fluashdb 这些命令,会导致redis长时间阻塞,大量请求被阻塞,cpu飙升,严重可能导致redis宕机,数据库雪崩。所以一些命令在生产环境禁止使用。 Redis 禁用命令…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...