【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.mzph.cn/news/881138.shtml

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

相关文章

爬虫案例——爬取情话网数据

需求&#xff1a; 1.爬取情话网站中表白里面的所有句子&#xff08;表白词_表白的话_表白句子情话大全_情话网&#xff09; 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…

vite学习教程03、vite+vue2打包配置

文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…

云手机可以解决TikTok运营的哪些问题?

随着社交媒体的飞速发展&#xff0c;TikTok迅速崛起&#xff0c;成为个人和企业进行品牌宣传和内容创作的首选平台。然而&#xff0c;在运营TikTok账号的过程中&#xff0c;不少用户会遇到各种问题。本文将详细阐述云手机如何帮助解决这些问题。 1. 多账号管理的高效便捷 通过云…

外包功能测试干了4年,技术退步太明显了。。。。。​

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

精准选择大模型:消费品行业的营销与体验创新之路

在消费品行业&#xff0c;大模型技术的引入正逐渐从一个新兴趋势转变为行业标配。随着人工智能的快速发展&#xff0c;特别是OpenAI等领军企业推出的创新技术&#xff0c;如Sora&#xff0c;大模型在市场营销、消费者行为分析、个性化推荐等方面展现出巨大潜力。然而&#xff0…

详解Java中的BIO、NIO、AIO

1、 详解Java中的BIO、AIO、NIO 1.1、引言 IO流是Java中比较难理解的一个知识点&#xff0c;但是IO流在实际的开发场景中经常会使用到&#xff0c;比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO&#xff1a;BIO、NIO以及AIO&#xff0c;重点介绍NIO。…

动态桌面时钟 让时间在桌面舞动 发现生活中的美好瞬间!

在快节奏的现代生活中&#xff0c;时间是最宝贵的资源之一。无论是在工作还是生活中&#xff0c;我们都需要时刻关注时间&#xff0c;在桌面显示一个时钟&#xff0c;可以让你更方便的掌握时间。今天小编给大家推荐一个软件《芝麻时钟》&#xff08;下载地址&#xff1a;https:…

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …

汇编DEBUG程序调用

工具 系统&#xff1a;Windows 11 应用&#xff1a;DOSBox 0.74-3 下载安装教程&#xff1a;本人写的《DOSBox下载安装&#xff08;Windows系统 DOSBox 0.74-3&#xff09;》 https://blog.csdn.net/just_do_it_sq/article/details/142715182?spm1001.2014.3001.5501 相关文…

ARM 架构、cpu

一、ARM的架构 ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构. 1、ARM芯片特点 ARM芯片的主要特点有以下几点&#xff1a; 精简指令集&#xff1a;ARM芯片使用精简指令集&#xff0c;即每条指令只完成一项简单的操作&#xff0c;从而提高指令的执行效率…

沂机管理系统/data/Ajax.aspx接口存在SQL注入漏洞

漏洞描述 沂机管理系统/data/Ajax.aspx接口存在SQL注入漏洞&#xff0c;攻击者可以获取服务器权限 漏洞复现 body"后台管理系统演示版" POC GET /data/Ajax.aspx?methodlog_list&page1&limit20&fkey1&fdate12024-10-0100%3A00%3A00&fdate2…

文章资讯职场话题网站源码整站资源自带2000+数据

介绍&#xff1a; 数据有点多&#xff0c;数据资源包比较大&#xff0c;压缩后还有250m左右。值钱的是数据&#xff0c;网站上传后直接可用&#xff0c;爽飞了 环境&#xff1a;NGINX1.18 mysql5.6 php7.2 代码下载

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点&#xff1a;支持IPv4 提供高精版、…

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?

前言&#xff1a; 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要&#xff1a;如何在0实习且没有任何产品相关经验下&#xff0c;如何上岸产品经理~ 目录 一、想清楚为什么…

k8s的简介和部署

一、k8s简介 在部署应用程序的方式上面&#xff0c;主要经历了三个阶段&#xff1a; 传统部署:互联网早期&#xff0c;会直接将应用程序部署在物理机上优点:简单&#xff0c;不需要其它技术的参与缺点:不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算资源&…

从零开始,她如何为客户创建语义知识图谱?

在这篇文章中&#xff0c;Capgemini 的知识图谱负责人 Veronika Heimsbakk 分享了她为客户创建语义知识模型的方法。阅读本指南&#xff0c;了解她如何与客户合作&#xff0c;从头开始构建语义知识模型&#xff0c;并发现可以应用于您自己的语义建模项目的实践。 如何为客户构…

参数标准+-db和-db

-db是因为比值是相近的&#xff0c;值越进行越好&#xff0c;正负db代表两个值差异不大&#xff0c;可以分子比分母大或者分母比分子大-db代表串扰&#xff0c;分子比分母小&#xff0c;所以负db的值越小越好

5G NR BWP 简介

文章目录 BWP介绍BWP 分类BWP相关总结 BWP介绍 5G NR 系统带宽比4G LTE 大了很多&#xff0c;4G LTE 最大支持带宽为20MHz&#xff0c; 而5G NR 的FR1 最大支持带宽为100MH在&#xff0c; FR2 最大支持带宽为 400MH在。带宽越大&#xff0c;意味了终端功耗越多。为了减少终端的…

(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)

目录 前言 修改方向 修改内容 效果展示 两个新的问题&#x1f64b; 1.问题1 2.问题2 代码如下&#xff1a; 前言 我们上一节实现了贪吃蛇吃食物身体节点变长&#xff0c;但是食物的刷新位置不是随机的&#xff0c;并且初始化几次后食物就刷不见了&#xff0c;本节我们就来…

基于webComponents的纯原生前端框架

我本人的个人开发web前端前框架xui&#xff0c;正在开发中&#xff0c;业已完成50%的核心开发工作&#xff0c;并且在开发过程中逐渐完善. 目前框架未采用任何和市面上框架模式&#xff0c;没有打包过程&#xff0c;实现真实的开箱即用。 当然在开发过程中也会发现没有打包工…