【C++】C++11新特性——基础特性
文章目录
- 一、列表初始化
- 1.1 {}初始化
- 1.2 initializer_list类型
- 二、类型推导
- 2.1 auto
- 2.2 auto注意事项
- 2.3 decltype
- 三、新增与改进
- 3.1 nullptr
- 3.2 范围for
- 3.3 array
- 3.4 forward_list
- 3.5 unordered系列
- 3.6 final与override
一、列表初始化
1.1 {}初始化
C++11 引入了一个新的初始化方式, 称为初始化列表(List Initialize), 具体的初始化方式如下:
初始化列表可以用于初始化结构体类型, 例如:
struct Test
{int _a;double _b;
};int main()
{Test tOld = { 1, 1.1 };Test tNew{ 2, 2.2 };// 列表初始化int a = 1;int b = { 1 };// 列表初始化int c{ 1 };// 列表初始化int arr1[] = { 1,2,3 };int arr2[]{ 1,2,3 };// 列表初始化return 0;
}
以前{}只能用来初始化结构体和数组,而现在一切皆可用列表初始化。
当然new操作符也可以使用{}初始化:
int* ptr1 = new int[] {1, 2, 3};
Test* ptr2 = new Test[]{ {1, 1.1}, {2, 2.2} };
对于自定义类型{}会调用它的构造函数初始化:
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;std::cout << "Date(int year, int month, int day)" << std::endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(1, 2, 3);Date d2{1, 2, 3};return 0;
}

其他一些不方便初始化的地方使用, 比如stl的初始化, 如果不使用这种方式, 只能用构造函数来初始化, 难以达到效果 。
int main()
{std::vector<int> v={ 1, 2, 3, 4, 5 };// 列表初始化std::list<int> lt{ 1, 2, 3, 4, 5, 6 };// 列表初始化for (auto& e : v){std::cout << e << " ";}std::cout << "\n";for (auto& e : lt){std::cout << e << " ";}std::cout << "\n";return 0;
}

这里明显不是使用构造函数初始化的
那么这里是怎么做到的呢?
利用std::initializer_list类型。
1.2 initializer_list类型
int main()
{auto tmp = { 1, 2, 3, 4 };std::cout << typeid(tmp).name() << std::endl;return 0;
}

typeid(变量名).name() 查看变量的类型
我们可以把它理解为一个存在常量区数组。
这个容器有以下接口:

这样我们就可以像迭代器一样使用这个容器。
所以vector和list就可以这样初始化:


其实使用initializer_list初始化就是遍历initializer_list的内容然后一个一个插入。
vector(initializer_list<T> il):_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(il.size());// 防止过度扩容typename initializer_list<T>::iterator it = il.begin();while (it != il.end()){push_back(*it);++it;}
}
二、类型推导
2.1 auto
auto的作用就是自动推导对象的类型。从这个意义上讲,auto并非一种"类型"声明,而是一个类型声明时的"占位符",编译器在编译时期会将auto替换为变量实际的类型。
double foo()
{return 1.1;
}struct Test
{};int main()
{// 内置类型int a = 1;auto b = a;// intauto c = foo();// double// 自定义类型Test test;auto ret = test;// struct Testreturn 0;
}
2.2 auto注意事项
1️⃣ 首先定义变量的时候一定要初始化
auto a;// error
a = 10;
2️⃣ 不能作为函数的形参
void func(auto a) {}// error
3️⃣ 变量不能作为自定义类型的成员变量
struct Test
{auto a = 1;// error
};
4️⃣ 不能是auto数组
auto arr[] = { 1, 2, 3 };// error
5️⃣ 模板实例化类型不能是auto类型
std::vector<auto> v;// error
2.3 decltype
关键字decltype将变量的类型声明为表达式指定的类型。我前面用的typeid(x).name()可以拿到x类型的字符串,但是不能使用这个再去定义一个变量。
而decltype却可以拿到变量,后面还可以继续使用这个类型定义出变量。
int main()
{int x = 0;decltype(x) a = 10;// intdouble y = 0.0;decltype(x + y) b;// doublereturn 0;
}
三、新增与改进
3.1 nullptr
nullptr 是为了解决原来 C++中 NULL 的二义性问题而引进的一种新的类型,因为NULL既能表示整型也能表示指针。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif /* NULL */
3.2 范围for
在 C++中 for 循环可以使用基于范围的 for 循环,示例代码如下:
int main()
{int a[] = { 1, 2, 3, 4, 5, 6 };for (int& e : a){std::cout << e << " ";}std::cout << '\n';return 0;
}
3.3 array
template < class T, size_t N > class array
array就是个数组,它跟vector的区别是array是静态数组,不能扩容。
那么它跟普通数组有什么区别呢?
普通的数组对越界的检查是随机的,如果越界可能不会报错,但是array一定能检查出来。
int main()
{int a1[10];a1[22];// 不报错std::array<int, 10> a2;a2[22];// 报错return 0;
}
3.4 forward_list
template < class T, class Alloc = allocator<T> > class forward_list
forward_list就是一个单链表,它只有头插和头删接口,并没有尾插和尾删接口。
int main()
{std::vector<int> a = { 1, 2, 3, 4, 5, 6 };std::forward_list<int> lt(a.begin(), a.end());for (auto& e : lt){std::cout << e << " ";}std::cout << '\n';return 0;
}
3.5 unordered系列
这个在之前的文章有详细介绍:
【C++】哈希
跟map与set相比效率得到了大提升。
3.6 final与override
这里在多态里面有过详细介绍:
【C++】多态
final关键字在父类修饰虚函数,表示该虚函数不能再被重写。
override在子类修饰虚函数,检查子类是否重写,如果没有重写则编译报错。
相关文章:
【C++】C++11新特性——基础特性
文章目录一、列表初始化1.1 {}初始化1.2 initializer_list类型二、类型推导2.1 auto2.2 auto注意事项2.3 decltype三、新增与改进3.1 nullptr3.2 范围for3.3 array3.4 forward_list3.5 unordered系列3.6 final与override一、列表初始化 1.1 {}初始化 C11 引入了一个新的初始化…...
Mac 遇到pip: command not found问题的解决
Mac 遇到pip: command not found问题的解决在学习Playwright时候,需要下载相关依赖Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或…...
[ 云计算 | Azure ] Episode 03 | 描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx
正常情况如果你不是会计,或者对钱相关的数字比较敏感的财务,本文的一些东西你不会接触的,但是最为云架构或者云运营,你可能会遇到如何采购亦或者估算的我成本和运营成本等等,所以本文的一些知识点就需要进行一定的了解…...
STM32F103R8T6 SPWM实现正弦波输出
前言 PWM合成正弦波,原理什么的不详细说了,概括一下就是 PWM有效面积的积分 正弦波的有效面积。PWM的频率越快,细分的越多,锯齿也就越不明显。 做法是:首先利用正弦波取点软件,取点1000个,生…...
Oracle 11g创建和删除数据库实例
一、创建数据库实例 1.点击“开始” -> “Oracle -OraDb11g_home1” -> “Database Configuration Assistant” 2.点击“下一步” 3.选择“创建数据库”,点击“下一步” 4.默认设置,不用更改,直接点击“下一步” 5.填写要创建的“实例…...
MySQL(四)视图、存储过程、触发器
视图、存储过程、触发器视图检查选项视图的更新存储过程存储过程基本语法变量系统变量用户自定义变量局部变量if判断参数casewhile循环repeat循环loop循环cursor游标handler条件处理程序存储函数触发器视图 视图(View)是一种虚拟存在的表。视图中的数据…...
在 Ubuntu 下编写 C++
在 Ubuntu 下编写 C 在 Ubuntu 上面编写 C,本章节内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编 辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim…...
Linux主要目录的意思
Linux目录的意思 文章目录Linux目录的意思bin目录(命令目录):二进制目录,二进制是可以直接执行的机器码,里面存放着可以执行的命令;bin目录右下角有个箭头类似于Windows的快捷方式 sbin目录:系…...
启动golang项目编译的exe可执行文件获取windows管理员权限(UAC)
背景: go代码启动以后里面涉及到修改ip地址等操作,需要管理员权限。打包好的exe文件双击执行默认是没有管理员权限的,那么修改ip就会提示需要管理员权限。 解决方法1:右键以管理员权限运行exe文件 解决方法2:编译exe…...
Springboot怎么快速集成Redis?
前言其实在Springboot中集成redis是一个非常简单的事情,但是为什么要单独输出一篇文章来记录这个过程呢?第一个原因是,我记性不是太好,这次把这个过程记录下,在新的项目搭建的时候或者需要在本地集成redis做一些其他相…...
COM技术简单介绍
COM (Component Object Model) 是一种面向对象的编程技术,它在 Windows 操作系统中广泛使用。COM 提供了一种标准的方法来创建和使用可重用的软件组件,这些组件可以通过不同的编程语言和应用程序进行访问和使用。 COM 技术的主要特点包括: 组…...
NetworkMiner网络取证分析工具(26)
预备知识 NetworkMiner是一款windows平台下开放源代码的网络取证分析工具,同时也是一款比较好的协议分析工具,它通过数据包嗅探或解析PCAP 文件能够检测操作系统,主机名和网络主机开放的端口。 除了能够进行基本的数据包抓取分析N…...
Lombok 常用注解
文章目录简介MAVEN 依赖常用的注解1. Data 注解 :2. Setter 注解:3.Getter 注解:4.Log4j or Slf4j 注解5.NoArgsConstructor注解:6.AllArgsConstructor注解:7.RequiredArgsConstructor注解:8.Builder注解:9.Cleanup注解…...
SAP 生产订单和成本收集器在核算上的主要区别
生产订单: 特点: 1、 按照批次进行核算 2、 只有完全完工,才能够进行差异分析,分析差异来源。 目标制造费用:按照工单创建确认的作业数量*计划作业价格的乘积得到; 实际制造费用:按照作业确认…...
Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
场景 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流: Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_win nginx-rtmp最新版_霸道流氓气质的博客-CSDN博客 Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流&…...
【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)
【大数据处理与可视化】一 、大数据分析环境搭建(安装 Anaconda 3 开发环境)实验目的实验内容实验步骤一、下载Anaconda安装包二、安装Anaconda3三、验证Anaconda是否安装成功四、Jupyter Notebook的使用1. 启动Anaconda自带的Jupyter Notebook2. 在code…...
Python3-输入和输出
Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。…...
Java后端通用接口设计
1、接口的响应要明确表示接口的处理结果 为了将接口设计得更合理,我们需要考虑如下两个原则: 对外隐藏内部实现。即服务A调用服务B,如果服务B异常,但是我们不要直接把服务B的状态码、错误描述直接暴露给用户; 设计接…...
万字长文带你走进MySql优化(系统层面优化、软件层面优化、SQL层面优化)
文章目录系统层面优化采用分布式架构使用缓存使用搜索引擎软件层面优化调整 MySQL 参数配置定期清理无用数据创建索引创建索引普通索引唯一索引全文索引组合索引空间索引主键索引外键索引索引前缀适合创建索引的场景不适合创建索引的场景优化表结构分库分表SQL优化explain执行计…...
云原生安全2.X 进化论系列|云原生安全2.X未来展望(4)
随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展,成为赋能业务创新的重要推动力,并已经应用到企业核心业务。然而,云原生技…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
