【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.xdnf.cn/news/1556094.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

Vue基础(二)

计算属性与监视姓名案例 插值语法实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>姓名案例&l…

用人工智能写作:专业作家利用 ChatGPT 的五种方式 ✍️

用人工智能写作&#xff1a;专业作家利用 ChatGPT 的五种方式 &#x1f3a8;✍️ 在写作领域&#xff0c;人工智能工具如 ChatGPT 正逐渐成为作家们的得力助手。它不仅帮助优化文本&#xff0c;还能激发灵感、完善叙事结构&#xff0c;甚至推动创新。本文将通过五个具体案例&a…

【微服务】服务注册与发现 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

实验4 循环结构

1、判断素数 【问题描述】从键盘输入一个大于1的正整数&#xff0c;判断是否为素数 【输入形式】输入一个正整数 【输出形式】输出该数是否为素数 【样例输入】10 【样例输出】10 is not a prime number 【样例说明】样例2 输入&#xff1a;-10 输出&#xff1a;error! #de…

jmeter学习(7)beanshell

beanshell preprocessor 发送请求前执行 beanshell postprocessor 发送请求前执行 获取请求相关信息 String body sampler.getArguments().getArgument(0).getValue(); String url sampler.getPath(); 获取响应报文 String responseprev.getResponseDataAsString(); 获…

北京自闭症寄宿学校大盘点:优质教育资源汇总

北京自闭症寄宿学校大盘点&#xff1a;优质教育资源中的璀璨明珠——兼谈广州星贝育园 在北京&#xff0c;随着社会对自闭症儿童教育的日益重视&#xff0c;越来越多的优质寄宿学校应运而生&#xff0c;为这些特殊的孩子提供了专业的康复与教育环境。然而&#xff0c;当我们把…

【数据结构】【链表代码】随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {if(headNULL)return NULL;//1.拷贝结点&#xff0c;连接到原结点的后面Node…

猫头虎深度解读:过去2周,AI领域的十大突破事件与未来展望

猫头虎深度解读&#xff1a;过去2周&#xff0c;AI领域的十大突破事件与未来展望 &#x1f680;&#x1f916; 大家好&#xff0c;我是猫头虎技术团队的代表&#xff01;这两周&#xff0c;人工智能领域再次掀起了技术与应用的新浪潮。从立法到技术进展&#xff0c;再到前沿应…

初始爬虫12(反爬与反反爬)

学到这里&#xff0c;已经可以开始实战项目了&#xff0c;多去爬虫&#xff0c;了解熟悉反爬&#xff0c;然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结&#xff1a; 1.爬虫占总PV较高&#xff0c;浪费资源 2.资源被批量抓走&#xff0c;丧失竞争力…

交叉熵的数学推导和手撕代码

交叉熵的数学推导和手撕代码 数学推导手撕代码 数学推导 手撕代码 import torch import torch.nn.functional as F# 二元交叉熵损失函数 def binary_cross_entropy(predictions, targets):# predictions应为sigmoid函数的输出&#xff0c;即概率值# targets应为0或1的二进制标…

MathType软件7.7最新版本下载安装教程+使用深度评测

嘿&#xff0c;各位亲爱的朋友们&#xff01;&#x1f44b; 今天我要来给大家安利一个神器——MathType软件&#xff01;&#x1f389; 如果你是一位学生、老师或者需要经常和数学公式打交道的科研工作者&#xff0c;那这个软件绝对是你的不二选择&#xff01;&#x1f60e; M…

ctf.bugku-备份是个好习惯

访问页面得到字符串 这串字符串是重复的&#xff1b; d41d8cd98f00b204e9800998ecf8427e 从前端、源码上看&#xff0c;除了这段字符串&#xff0c;没有其他信息&#xff1b;尝试解密&#xff0c;长度32位&#xff1b;各种解密方式试试&#xff1b; MD5免费在线解密破解_MD5在…

市面上8款AI论文大纲一键生成文献的软件推荐

在当前的学术研究和写作领域&#xff0c;AI论文大纲自动生成软件已经成为提高写作效率和质量的重要工具。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享市面上8款AI论文大纲一键生成文献的软件&#xff0c;并特别推…

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch&#xff0c;需要添加源&#xff01;&#xff01; pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.htmlpython 项目中 …

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…

代码随想录Day54

今天是国庆假期后的恢复做题的第一天&#xff0c;摆了那么久感觉还是有点没摆够哈哈哈哈&#xff01;今天两道题都是困难题&#xff0c;两道题都去看讲解了&#xff0c;感觉这两道题是高度相似的&#xff0c;接雨水用单调递增栈来做&#xff0c;柱状图中最大的矩形用单调递减栈…

tcp/ip、以太网、mqtt、modbus/tcp复习

1.osi参考模型 2. modbus是应用层报文传输协议&#xff0c;没有规定物理层&#xff0c;只规定了协议帧&#xff0c;但是定义了控制器能够认识和使用的消息结构&#xff0c;不管它们是经过何种网络进行通信的&#xff0c;具有很强的适应性。 一主多从&#xff0c;同一时间主机…