【C++】C++11的新特性

目录

    • 一. 列表初始化
      • 1. 列表初始化的原理: initializer_list
    • 二. 类型的声明
      • 1. auto
      • 2. decltype
    • 三. nullptr
    • 四. 范围 for
    • 五. STL容器变化
    • 六. 类的新功能

一. 列表初始化

  • 在 C 语言中, 就可以使用 {} 对数组或结构体进行初始化, 而 C++11 扩大了 {} 的使用范围, 使其可以初始化所有的内置类型和自定义类型, 并且使用时可以省略 =.
int main()
{
    // 可以使用 {} 给所有类型初始化, 并且可以省略 赋值符号
    int arr1[]{ 1,2,3 };
    int a1 = { 1 };
    int a2{ 2 };
    int* p1 = { &a1 };
    int* p2{ nullptr };
    int* p3 = new int{3};
    vector<int> v1 = { 1 };
    vector<int> v2{ 1,2 };

    return 0;
}

1. 列表初始化的原理: initializer_list

  • initializer_list 是 C++11 新添加的一个类, 支持迭代器. initializer_list - C++ Reference
    在这里插入图片描述
    当使用初始化列表时, initializer_list 会自动将一个由相同元素构成的列表转化为一个 initializer_list 的对象;
    但需要注意的是, initializer_list 对象中的元素实际是常量值, 是无法改变 initializer_list 对象中元素的值.
    在这里插入图片描述
  • 在 C++11 允许构造函数和其他函数把初始化列表当做参数.
    在这里插入图片描述
  • 当使用列表初始化时, 若列表初始化中的参数与类的构造函数相匹配, 那么就会直接调用构造函数;
    若不匹配或列表赋值时, 则会创建 initializer_list 的对象, 调用参数为 initializer_list 的构造或赋值函数.
int main()
{
	//直接调用构造函数
	string s1{"123"};
	
    //调用参数为 initializer_list 的构造函数
    vector<int> v1{ 1,2 };
    //调用参数为 initializer_list 的赋值函数
	v1 = { 1,2,3 };
    return 0;
}

二. 类型的声明

1. auto

  • 在 C++98 中 auto 是一个存储类型的说明符, 表明变量是局部自动存储类型, 但在局部域中定义的局部变量默认就是自动存储类型, 所以auto就没什么大用;
    在 C++11 中改变 auto 的用法, 将其实现自动类型推导. 不过必须对 auto 定义的变量进行显示初始化, 这样编译器才能将定义对象的类型设置为初始化值的类型.
    在这里插入图片描述

2. decltype

  • decltype 可以获取参数的类型, 将变量的类型声明为表达式指定的类型;
  • 类似 typeid().name(), 不过 decltype 获取的是真正的类型, 可以当作类型声明使用, 而 typeid().name() 获取的只是字符串.
    在这里插入图片描述
    与 auto 相比:
    decltype 需要参数;
    decltype 无需显式实例化, 可以直接定义;
    decltype 可以作为模板参数传递.

三. nullptr

由于 C++11 之前空指针 NULL 被定义成字面量 0, 在传参等情况会导致二义性, 所以在 C++11 中新增了关键字 nullptr, 用于表示空指针.

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

四. 范围 for

范围 for 的功能就是遍历容器并取出所有的元素;
而底层使用的就是迭代器, 所以支持迭代器的容器就会支持范围 for.

//此处的 it 类型为迭代器的类型
for (auto it = begin(); it != end(); it++)
{
	// 对迭代器进行操作
}

//此处的 e 类型为容器元素的类型
//若希望减少拷贝或修改容器元素, 可以使用引用类型, (auto& e : 容器)
for (auto e : 容器)
{
	// 对 e 进行操作(e 为容器元素的拷贝)
}

五. STL容器变化

  • 新增容器
    C++11 为 STL 增加了几种新容器, unordered_map/unordered_set 都是使用哈希思想实现的容器, 底层为散列表.
    在这里插入图片描述
  • 新增接口
    initializer_list 系列的接口;
    在这里插入图片描述
    右值引用的相关接口;
    在这里插入图片描述

新增了 const 迭代器的接口.
在这里插入图片描述

六. 类的新功能

C++11 类的主要增加了以下新功能:

默认成员函数增加了移动构造和移动赋值;
允许类的成员变量使用缺省值进行初始化;
增加强制生成和强制禁止生成默认函数的关键字 default 和 delete;
继承和多态部分增加 final 和 override 关键字.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索http-vue-loader的奥秘:原理、使用方法、在Vue开发中的应用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

《深度学习入门之PyTorch》书籍阅读笔记

《深度学习入门之PyTorch》书籍阅读笔记 ISBN 978-7-121-32620-2 多层全连接神经网络 Pytorch基础 Tensor张量 是一个多维矩阵&#xff0c;pytorch的tensor可以和numpy的ndarray相互转换&#xff0c;但numpy的ndarray只能在CPU上运行。不同数据类型的Tensor&#xff0c;t…

2024 年高效开发的 React 生态系统

要使用 React 制作应用程序&#xff0c;需要熟悉正确的库来添加您需要的功能。例如&#xff0c;要添加某个功能&#xff08;例如身份验证或样式&#xff09;&#xff0c;您需要找到一个好的第三方库来处理它。 在这份综合指南中&#xff0c;我将向您展示我建议您在 2024 年使用…

多协议支持 API 调测客户端:Postman 的强力替代品 | 开源日报 No.210

Kong/insomnia Stars: 32.6k License: Apache-2.0 insomnia 是一个开源的、跨平台的 API 客户端&#xff0c;支持 GraphQL、REST、WebSockets、SSE 和 gRPC 协议&#xff0c;并提供云存储、本地存储和 Git 存储。 调试各种流行协议和格式的 API。使用原生 OpenAPI 编辑器设计…

计算机网络-HTTP相关知识(一)

HTTP基础 基本概念&#xff1a;HTTP是一种计算机之间交流通信的规范&#xff0c;它允许数据在两点之间传输&#xff0c;这个过程可以包括中转或接力。HTTP不仅仅包括文本&#xff0c;还可以包括图片、音频等超文本。状态码&#xff1a;HTTP状态码分为五类&#xff1a; 2xx&…

11-SpringSecurity:Session共享,菜鸟驿站java面试题

pom依赖 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis org.projectlombok lombok …

蓝桥杯第十五届抱佛脚(八)并查集

蓝桥杯第十五届抱佛脚&#xff08;八&#xff09;并查集 基本概念 并查集是一种数据结构&#xff0c;用于管理一系列不交集的元素集合&#xff0c;并支持两种操作&#xff1a; 查找&#xff08;Find&#xff09;&#xff1a; 查找操作用于确定某个元素属于哪个集合&#xf…

Java基础学习: JDK动态代理

文章目录 一、什么是JDK动态代理二、JDK动态代理的特点三、JDK动态代理类如何使用四、JDK动态代理原理分析1、创建代理对象2、生成代理类 一、什么是JDK动态代理 JDK动态代理是Java提供的一种动态生成代理类和代理对象的技术。它主要利用Java的反射机制实现&#xff0c;在运行…

Lucene及概念介绍

Lucene及概念介绍 基础概念倒排索引索引合并分析查询语句的构成 基础概念 Document&#xff1a;我们一次查询或更新的载体&#xff0c;对比于实体类 Field&#xff1a;字段&#xff0c;是key-value格式的数据&#xff0c;对比实体类的字段 Item&#xff1a;一个单词&#xff0…

【计算机网络】四层负载均衡和七层负载均衡

前言 1、分层方式 首先我们知道&#xff0c;在计算机网络中&#xff0c;常用的协议分层方式&#xff1a;OSI和TCP/IP&#xff0c;以及实际生产中使用的协议划分方式。 在OSI中&#xff0c;各层的职责如下&#xff1a; 应用层&#xff1a;对软件提供接口以使程序能使用网络服…

都江堰操作系统系统架构图

都江堰操作系统设计思想源于中国传统的“天人合一&#xff0c;道法自然”哲学思想&#xff0c;内核调度系统采用事件调度&#xff0c;全球首创&#xff0c;突破单机桎梏&#xff0c;实现异构网络调度&#xff0c;开拓新赛道&#xff0c;实现换道超车。“有事就动&#xff0c;没…

Linux的中间件

我们先补充点关于awk的内容 awk的用法其实很广。 $0 表示整条记录 变量&#xff1a; NF 一行中有多少个字段&#xff08;表示字段数&#xff09; NR &#xff1a; 代表当前记录的序号&#xff0c;从1开始计数。每读取一条记录&#xff0c;NR的值就会自动增加1。&#xff08;…

Applied Spatial Statistics(一)统计推断

Applied Spatial Statistics&#xff08;一&#xff09;统计推断 1.统计推断&#xff1a;Bootstrap 置信区间 本笔记本演示了如何使用引导方法构建统计数据的置信区间。 我们还将检查 CI 的覆盖概率。 构建 Bootstrap 置信区间检查覆盖概率Bootstrap CI 相关系数 import nu…

数据挖掘入门项目二手交易车价格预测之特征工程

文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池&#xff1a;https://tianchi.aliyun.com/competition/entrance/231784/informat…

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

基于知识图谱的个性化学习推荐系统的设计与实现(论文+源码)_kaic

摘 要 Abstract 1 绪 论 1.1 研究背景及意义 1.2 国内外现状研究 1.3 研究工作和论文结构 2 相关技术 2.1 HTML 语言 2.2 Python 语言 2.3 数据库技术 2.4 Django 框架 3 系统分析 3.1 需求概述 3.2 系统可行性分析 3.2.1 技术可行性 3.2.2 经济可行性 3.2.3 操作可行性 3.3 功…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有&#xff1a;json、protobuf、xml三种方案&#xff1b; 5.1json的使用 1.安装jsoncpp库&#xff0c;是一个第三方的开发库文件&#xff1b; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

Python之Opencv教程(2):图像边缘检测

1、什么是边缘检测 OpenCV中的边缘检测是一种常见的图像处理技术&#xff0c;用于检测图像中物体边缘的位置。常用的边缘检测算法包括Sobel算子、Scharr算子、Laplacian算子和Canny边缘检测算法等。下面将介绍使用OpenCV实现这些边缘检测算法的方法。 2、边缘检测的作用 边缘…

C语言---自定义类型:联合体和枚举

文章目录 前言1. 联合体类型的声明1.1 联合体类型的声明1.2 联合体的特点1.4 联合体大小的计算1.5 联合的一个练习 2.枚举2.1 枚举类型的声明2.2 枚举类型的优点 前言 上一篇我们学习了自定义类型—结构体&#xff0c;大家会发现&#xff0c;构建一个结构体时&#xff0c;有些…