【C++11】新特性

前言:

C++11 C++编程语言的一个重要版本,于2011年发布。它带来了数量可观的变化,包含约 140 个新特性,以及对 C++03 标准中约600个缺陷的修正,更像是从 C++98/03 中孕育出的新语言

列表初始化

C++11 中的列表初始化(List Initialization)是一种新的初始化语法,它提供了更统一、更灵活和更安全的初始化方式。以下是关于 C++11 列表初始化的详细介绍

基本语法

可以直接在变量名后面加上初始化列表来进行对象的初始化。

int x = {10};  // 初始化一个整数变量 x 为 10
int arr[] = {1, 2, 3};  // 初始化一个整数数组 arr
std::vector<int> v = {4, 5, 6};  // 初始化一个 std::vector 容器

适用范围

  • **内置类型:**可用于所有内置类型,如整数、浮点数、字符等。
  • **自定义类型:**对于自定义的类或结构体,如果满足聚合类型的条件,也可以使用列表初始化。如果类定义了合适的构造函数(包括接受 std::initializer_list 类型参数的构造函数),同样可以使用列表初始化

聚合类型的条件

在 C++11 中,聚合类型需要满足以下条件1:

  • 类型是一个普通数组:如 int[5]char[]double[3] 等。
  • 类型是一个类,且满足以下条件:
    • 没有用户声明的构造函数。
    • 没有用户提供的构造函数(允许显示预置或弃置的构造函数)。
    • 没有私有或保护的非静态数据成员。
    • 没有基类。
    • 没有虚函数。
    • 没有 {}= 直接初始化的非静态数据成员。
    • 没有默认成员初始化器

initializer_list

initializer_list C++11 引入的一种模板类,用于表示某种类型的对象的列表。它提供了一种方便的方式来处理和传递一组相同类型的值,类似于其他语言中的列表或数组。以下是关于 initializer_list 的一些重要特点和用法:

  • 创建和初始化

    • 可以使用花括号 {} 来创建一个 std::initializer_list 对象,并在其中列出要包含的元素。例如:std::initializer_list<int> myList = {1, 2, 3, 4, 5};
    • 元素的类型必须相同,否则会导致编译错误。不过,编译器会进行一些隐式的类型转换,例如将 int 类型的元素转换为 double 类型的列表是允许的,但可能会有精度损失。例如:std::initializer_list<double> doubleList = {1, 2, 3}; 这里 123 会被隐式转换为 1.02.03.0
    • 不允许进行缩窄转换,即会导致数据丢失或精度降低的转换是不被允许的。例如:std::initializer_list<char> charList = {1000}; 会导致编译错误,因为 1000 超出了 char 类型的取值范围。
  • 常见用法

    • 初始化容器:可以方便地用于初始化标准库中的容器,如 std::vectorstd::list 等。例如:std::vector<int> vec = {1, 2, 3};
    • 函数参数:函数可以接受 std::initializer_list 作为参数,从而可以接收任意数量的同类型参数。例如:
    void printValues(std::initializer_list<int> values) {for (auto value : values) {std::cout << value << " ";}std::cout << std::endl;
    }int main() {printValues({1, 2, 3, 4, 5});return 0;
    }
    
    • 类的构造函数:在类的构造函数中使用 std::initializer_list,可以方便地实现多种初始化方式。例如:

在这里插入图片描述

auto

C++11 中,auto是一个用于自动类型推导的关键字。它可以让编译器根据初始化表达式的类型自动推断变量的类型,从而简化代码的编写,提高代码的可读性和可维护性1。以下是关于 auto 的一些重要特点和用法:

  • 基本用法:在定义变量时,使用 auto 关键字,编译器会根据初始化的值来推断变量的类型。例如:
auto x = 5;  // x 的类型为 int
auto y = 3.14;  // y 的类型为 double
auto z = "hello, world!";  // z 的类型为 const char*

与指针和引用结合

  • auto 可以与指针结合使用,用于自动推导指针类型。例如:
int num = 10;
auto ptr = &num;  // ptr 的类型为 int*
  • 用于函数返回值类型推导(C++14):在 C++14 标准中,可以使用 auto 关键字结合 -> 运算符来推导函数的返回值类型。例如:
auto add(int a, int b) -> int {return a + b;  // 返回 a 和 b 的和
}
  • 在范围 for 循环中的应用(C++11):C++11 引入的范围 for 循环结合 auto 关键字,可以更方便地遍历容器。例如:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto number : numbers) {std::cout << number << std::endl;  // 输出每个元素
}

优点

  • 简化代码:避免了手动指定复杂的类型,尤其是对于模板库中复杂的迭代器类型等,使用 auto 可以大大简化代码的书写1。
  • 提高可读性:使代码更加清晰易读,减少了类型声明带来的视觉干扰,让开发者更关注于代码的逻辑而不是类型的细节1。
  • 灵活性:在类型需要改变时,只需要修改初始化表达式的类型,而使用 auto 定义的变量的类型会自动随之改变,减少了代码修改的工作量。

decltype

基本语法

decltype(expression) variable_name;
  • expression:用于推导类型的表达式。
  • variable_name:根据推导出的类型声明的变量名。

使用场景

  1. 推导变量的类型
    通过 decltype,你可以推导一个已有变量的类型:

    int a = 5;
    decltype(a) b = 10; // b的类型是int,和a相同
    
  2. 推导表达式的类型
    decltype 也可以用于推导更复杂的表达式的类型:

    int x = 10;
    decltype(x + 1.0) y;  // y的类型是double,因为x+1.0的结果是double
    
  3. 用于函数返回类型
    在C++11中,你可以通过 decltype 根据函数内部表达式来指定返回类型:

    template<typename T1, typename T2>
    auto add(T1 a, T2 b) -> decltype(a + b) {return a + b;
    }
    

    这里,decltype(a + b) 将推导出 a + b 的类型,并用作返回类型。

  4. 在lambda表达式中使用
    在C++11中,你可以在lambda表达式中使用 decltype 推导捕获变量或返回值的类型:

    auto lambda = [](int x, int y) -> decltype(x + y) {return x + y;
    };
    

decltype与auto的区别

  • auto 用于根据初始化表达式推导变量类型。
  • decltype 不需要初始化,直接根据表达式推导类型,可以用于声明变量、函数返回类型等。

例如:

int a = 5;
auto b = a;  // auto推导b为int
decltype(a) c;  // decltype推导c为int,但c未初始化

用于根据初始化表达式推导变量类型。

  • decltype 不需要初始化,直接根据表达式推导类型,可以用于声明变量、函数返回类型等。

例如:

int a = 5;
auto b = a;  // auto推导b为int
decltype(a) c;  // decltype推导c为int,但c未初始化

decltype 可以在编译时推导任意表达式的类型,因此在模板和泛型编程中,decltype 是一个强大的工具。

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

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

相关文章

探索Kimi:用Spring Boot + Vue打造现代网站

在数字化时代&#xff0c;网站成为了企业和个人展示自己的窗口。今天&#xff0c;我将带你一起探索如何利用Spring Boot和Vue.js这两个强大的技术栈&#xff0c;结合Kimi的智能助手功能&#xff0c;来构建一个现代的网站。这不仅是一个技术分享&#xff0c;更是一次实战演示&am…

ubuntu22.04桌面美化

文章目录 原桌面自动隐藏任务栏图标居中去除桌面上的Home文件夹去除硬盘图标和垃圾箱图标壁纸网站 原桌面 自动隐藏任务栏图标居中 效果&#xff1a; 去除桌面上的Home文件夹 去除硬盘图标和垃圾箱图标 壁纸网站 https://hdqwalls.com/wallpaper/3840x2160/cherry-blossom-p…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)

目录 一、前言二、聚合查询2.1 聚合函数2.1.1 COUNT():统计所有行2.1.2 SUM(列名) 求和2.1.3 AVG()2.1.4 MAX()、MIN() 2.2 GROUP BY子句&#xff08;分组查询&#xff09;2.3 HAVING 三、联合查询3.1表的笛卡儿积3.2内连接3.2.1 例题一3.2.2 例题二 3.3外连接3.3.1 右外连接3.…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

ConcurrentHashMap在JDK1.7和1.8的区别,详解

目录 1.了解HashMap底层插入原理 2.ConcurrentHashMap 是什么&#xff1f; HashTable的实现 3.ConcurrentHashMap 1.7和1.8的区别 4、JDK1.7 中的ConcurrentHashMap实现原理 6、JDK1.8中的ConcurrentHashMap 7.链表转红黑树条件 1.8 put方法 8.并发扩容 9.总结 首先呢…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API&#xff1a; 在开发环境中设置为 /dev-api&#xff0c;这是一个本地 mock 地址&#xff0c;通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA&#xff1a; 设置为 "true"&#xff0c;表示启用调试工具&#xff0c;通常是为了…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第一章节&…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接&#xff08;三次握手&#xff09; HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和一个ScriptDataV…

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串&#xff0c;以及大小固定并且初始元素已知的二叉最小堆&#xff08;为完全二叉树或类似完全二叉树&#xff0c;且父元素键值总小于等于任何一个子结点的键值&#xff09;&#xff0c;要求利用堆实现置换选择排序&a…

idea2024设置中文

今天下载idea2024.2版本&#xff0c;发现已经装过中文插件&#xff0c;但是还是不显示中文&#xff0c;找了半天原来还需要设置中文选项 方案一 点击文件 -> 关闭项目 点击自定义 -> 选择语言 方案二 点击文件 -> 设置 外观与行为 -> 系统设置 -> 语言和地区…

[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪

【算法介绍】 YOLOv11、ByteTrack和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个…

高空抛物AI检测算法:精准防控,技术革新守护城市安全

近年来&#xff0c;随着城市化进程的加速&#xff0c;高楼大厦如雨后春笋般涌现&#xff0c;但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全&#xff0c;还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生&#xff0c;…

微服务获取用户信息和OpenFeign传递用户

问题一&#xff1a; 网关已经完成登录校验并获取登录用户身份信息。但是当网关将请求转发到微服务时&#xff0c;微服务又该如何获取用户身份呢&#xff1f; 由于网关发送请求到微服务依然采用的是Http请求&#xff0c;因此我们可以将用户信息以请求头的方式传递到下游微服务…

毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

SQL Inject-基于报错的信息获取

常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路&#xff1a; 在MySQL中使用一些指定的函数来制造报错&am…

如 有 任 何 问 题 ,请 及 时 联 系 我 们 反 馈 !

如有任何问题&#xff0c; 请及时联系我们反馈 !https://support.qq.com/products/671606 如有任何问题&#xff0c; 请及时联系我们反馈 !

中间件介绍

可以把中间件想象成是在应用和系统之间搭建的一座桥梁&#xff0c;或者说是一个“翻译官”和“中转站”。它处在操作系统、网络和数据库之上&#xff0c;应用软件的下层&#xff0c;负责实现应用软件之间的互联互通&#xff0c;使得应用软件能够更方便、高效地进行数据交换和通…

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵 3.4 Softmax 回归3.4.1 分类问题3.4.2 网络架构 3.4.3 全连接层的参数开销3.4.4 softmax 运算3.4.5 小批量样本的向量化3.4.6 损失函数对数似然softmax 的导数 3.4.7 信息论基础熵信息量重新审…